【问题标题】:Parsing Dates takes huge amount of RAM解析日期需要大量 RAM
【发布时间】: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 实例。

我错过了什么吗?

我能以某种方式解决这个问题吗?

【问题讨论】:

标签: swift memory memory-leaks


【解决方案1】:

好的,感谢 Martin R 的指针,解决方案似乎涉及自动释放池。 这是解决问题的代码的更新版本:

导入基础

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
相关资源
最近更新 更多