【问题标题】:Filehandle class loading whole file into memoryFilehandle 类将整个文件加载到内存中
【发布时间】: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 块中的数据。

由于某种原因,这些块没有被释放。

知道会发生什么吗?

【问题讨论】:

标签: ios swift


【解决方案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 的提示。

【讨论】:

    猜你喜欢
    • 2012-05-07
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2019-12-13
    • 2016-08-24
    相关资源
    最近更新 更多