因此,我必须解析可能包含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实例处于活动状态。
我想念什么吗?
我可以以某种方式解决该问题吗?
答案 0 :(得分:0)
好吧,感谢Martin R的指针,该解决方案似乎涉及autoreleasepool。 这是解决此问题的代码的更新版本:
导入基金会
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 {
autoreleasepool {
if let t = formatter.date(from: dateStr) {
if t > Date.distantPast {
after += 1
}
}
}
}
}
testMem()
RunLoop.main.run()