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 类将整个文件加载到内存中的主要内容,如果未能解决你的问题,请参考以下文章

合并大文件而不将整个文件加载到内存中?

如何读取大的avro文件,并将整个文件加载到内存中。

Actionscript 3,只能读取文件的一部分而不将整个文件加载到内存中

从文本文件中读取第一行而不将整个文本文件加载到内存中

python 以块的形式读取文件而不将整个文件加载到内存中。

WebFlux WebClient 在分段上传期间将整个文件加载到直接缓冲内存中