我正在尝试从大文件中按顺序读取数据。因为文件可能比可用内存大,所以我不希望文件完全加载到内存中。
class RecordImporter {
func `import`(url: URL) {
guard let reader = RecordReader(url: url) else { return }
self.resume(from: reader)
}
private func resume(from reader: RecordReader) {
while let _ = reader.nextData() {
}
//Checking memory here is about 300Mb, the test file size.
return
}
}class RecordReader {
private var fileHandle: FileHandle
init?(url: URL) {
do {
self.fileHandle = try FileHandle(forReadingFrom: url)
}
catch {
return nil
}
}
func nextData() -> Data? {
let data = self.fileHandle.readData(ofLength: 10000)
guard !data.isEmpty else { return nil }
return data
}
}while循环完成后,内存大约是300Mb,即使我是以10Kb的区块读取数据。
由于某些原因,这些块没有被释放。

知道会发生什么吗?
发布于 2019-06-17 20:28:48
在自动释放池中打包使用数据之前,我曾尝试过,例如:
func nextData() -> Data? {
let data = autoreleasepool {
let data = self.fileHandle.readData(ofLength: 10000)
guard !data.isEmpty else { return nil }
return data
}
return data
}
} 我没有意识到的是,需要在里面的是阅读动作:
autoreleasepool {
while let data = reader.nextData() {
print(data.count)
}
}这可以正常工作。谢谢Martin的提示。
https://stackoverflow.com/questions/56631053
复制相似问题