解析日期需要大量RAM

时间:2019-02-20 12:19:01

标签: swift memory memory-leaks

因此,我必须解析可能包含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实例处于活动状态。

我想念什么吗?

我可以以某种方式解决该问题吗?

1 个答案:

答案 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()