gpt4 book ai didi

swift - 解析日期需要大量的 RAM

转载 作者:行者123 更新时间:2023-11-28 07:30:46 25 4
gpt4 key购买 nike

所以我必须解析可能包含 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。看起来 Dates 永远不会被释放。分析此代码没有显示任何泄漏。因为内存线性增长意味着我无法真正解析大文件:进程最终会被杀死,因为它使用了太多 RAM。

从概念上讲,我不明白为什么这个程序会消耗这么多内存:任何时候只有一个 Date 实例处于事件状态。

我错过了什么吗?

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

最佳答案

好的,感谢 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()

关于swift - 解析日期需要大量的 RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54786247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com