从文件读取数据时遇到内存泄漏。此代码创建了泄漏:从文件句柄读取数据在Linux上泄漏内存
func read() throws {
let url = URL(fileURLWithPath: "content.pdf")
let fileHandle = try FileHandle(forReadingFrom: url)
while true {
let chunk = fileHandle.readData(ofLength: 256)
guard !chunk.isEmpty else {
break
}
}
print("read")
}
do {
for _ in 0 ..< 10000 {
try read()
}
}
catch {
print("Error: \(error)")
}
* FYI:运行这段代码,你将不得不在你的工作目录下的“content.pdf”文件。
如果我使用Swift 3.1.1(或3.1)在Linux上运行此代码,它会执行一些循环的迭代,消耗越来越多的内存,直到进程终止。
在Mac上,这也会发生,因为数据被放入Autorelease池中,我可以通过将每次迭代包装在autorelease池中来解决内存问题,但是这在Linux中不存在,所以我不知道如何才能释放增加内存。有人有想法吗?
请看看swift用户邮件列表:希望这可以提供帮助。 https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20161031/003823.html –
@LuisRamirez是的谢谢你,我发现之前已经发布。自动发布池不用于FileHandle/Data的Linux实现。最后,我深入研究了corelibs代码,发现了最终的错误,并提出了一种解决方法(以下回答)。 – drewag