1

我正在尝试按顺序从大文件中读取数据。由于文件可能比可用内存大,我不希望文件完全加载到内存中。

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 块中的数据。

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

在此处输入图像描述

知道会发生什么吗?

4

1 回答 1

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

这可以正常工作。感谢马丁的提示。

于 2019-06-17T12:28:48.440 回答