Filehandle 类将整个文件加载到内存中
Posted
技术标签:
【中文标题】Filehandle 类将整个文件加载到内存中【英文标题】:Filehandle class loading whole file into memory 【发布时间】:2019-06-17 12:11:40 【问题描述】:我正在尝试按顺序从大文件中读取数据。由于文件可能比可用内存大,我不希望文件完全加载到内存中。
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 块中的数据。
由于某种原因,这些块没有被释放。
知道会发生什么吗?
【问题讨论】:
您可能应该读取本地 autoreleasepool 中的每个块。 – 可能与 ***.com/q/40576214/1187415 重复。 【参考方案1】:在将我使用的数据包装在自动释放池中之前,我曾尝试过,例如:
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 的提示。
【讨论】:
以上是关于Filehandle 类将整个文件加载到内存中的主要内容,如果未能解决你的问题,请参考以下文章
Actionscript 3,只能读取文件的一部分而不将整个文件加载到内存中