gpt4 book ai didi

swift - 从文件句柄读取数据在 Linux 上泄漏内存

转载 作者:搜寻专家 更新时间:2023-11-01 06:32:14 25 4
gpt4 key购买 nike

我在从文件中读取数据时遇到内存泄漏。此代码造成泄漏:

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)")
}

*仅供引用:要运行此代码,您的工作目录中必须有一个“content.pdf”文件。

如果我在使用 Swift 3.1.1(或 3.1)的 Linux 上运行它,它会执行多次循环迭代,消耗越来越多的内存,直到进程被终止。

在 Mac 上也会发生这种情况,因为数据被放入自动释放池,我可以通过将每次迭代包装在自动释放池中来解决内存问题,但在 Linux 上不存在,所以我不知道如何释放那段内存有人有想法吗?

最佳答案

我发现了标准库中的问题。实际上已经有一个bug report为它打开。基本上,问题是 readData(ofLength:) 方法返回一个 Data 对象,该对象在释放时不会自行清理。

目前,我正在使用此解决方法:

extension FileHandle { 
public func safelyReadData(ofLength length: Int) -> Data {
#if os(Linux)
var leakingData = self.readData(ofLength: length)
var data: Data = Data()
if leakingData.count > 0 {
leakingData.withUnsafeMutableBytes({ (bytes: UnsafeMutablePointer<UInt8>) -> Void in
data = Data(bytesNoCopy: bytes, count: leakingData.count, deallocator: .free)
})
}
return data
#else
return self.readData(ofLength: length)
#endif
}
}

我以前在任何地方使用 readData(ofLength:) 我现在使用我的 safelyReadData(ofLength:) 方法。在除 Linux 以外的所有平台上,它只是调用原始版本,因为这些实现很好。在 Linux 上,我创建了一个数据副本,它在解除分配时实际上会释放底层数据。

关于swift - 从文件句柄读取数据在 Linux 上泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45537998/

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