使用字符串消耗大量内存

时间:2016-12-23 11:43:25

标签: swift string memory optimization

我在结构中收集字符串数据。最后,我将该字符串写入文件。结果是4个文件,每个80 MB。但内部它占用了近16 GB(!)的RAM,迫使操作系统进行交换。 (我使用的是Swift 3.0)

struct ActionCMD {  // struct!
    var cmd = String()

...

    mutating func lines(_ text: String, toTheTop: Bool = false) {
        if toTheTop { cmd  = text + cmd }
        else        { cmd += text }
    }
...
}

知道为什么会这样,以及如何避免?

3 个答案:

答案 0 :(得分:1)

它可能与标记为mutating的方法有关。 Swift中的mutating方法会将其“更改”应用于ActionCMD实例的新副本。根据代码的其余部分,您可能会保留所有这些实例。

答案 1 :(得分:0)

首先,如果不知道如何分配和取消分配这些实例,很难告诉您应用程序出了什么问题。您遇到的问题可能与保留周期或收集String数据的方式有关。字符串是一种值类型,因此每次更改时都会产生新的副本,因为写入时复制功能。也就是说,我能给你的最好的建议是让你在使用ObjC和Swift改进内存管理的几个技巧上进行检查good article 。希望这会有所帮助。

答案 2 :(得分:-1)

在C#和Java中,您将使用stringbuilder,因为如果您不添加内容,则每次添加时都会创建一个新字符串。 stringbuilder只分配一次内存。

这个:http://cocoadocs.org/docsets/StringBuilder/似乎是从Java到Swift的端口,还没有测试过,但是你可以尝试一下。

这一个:https://gist.github.com/kristopherjohnson/1fc55e811d944a430289非常糟糕(遗憾的是谷歌的第一个结果)。它不是一个字符串构建器,只是常规方法的包装器。

相关问题