【发布时间】:2019-07-14 03:17:48
【问题描述】:
所以我必须解析可能包含 ISO8601 格式日期的巨大日志文件。 我使用 DateFormatter 来处理日期解析。 问题是内存随着解析次数的增加而线性增长。 这是说明问题的我的代码的简化版本:
import Foundation
func testMem() {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd' 'HH:mm:ss.SSS"
formatter.calendar = Calendar(identifier: .iso8601)
let dateStr = "2017-10-16 19:01:35.360"
var after: Int = 0
for _ in 0..<1_000_000 {
if let t = formatter.date(from: dateStr) {
if t > Date.distantPast {
after += 1
}
}
}
}
testMem()
RunLoop.main.run() //to let the program run
此程序的内存使用量约为 200Mb。 看起来日期永远不会被释放。分析此代码不会显示任何泄漏。 因为内存线性增长意味着我无法真正解析大文件:进程最终会因为占用太多 RAM 而被杀死。
从概念上讲,我不明白为什么这个程序会消耗这么多内存:任何时候都应该只有一个 Date 实例。
我错过了什么吗?
我能以某种方式解决这个问题吗?
【问题讨论】:
-
谢谢@MartinR!我会根据autoreleasepool添加一个答案。
标签: swift memory memory-leaks