Filehandle类将整个文件加载到内存中

时间:2019-06-17 12:11:40

标签: ios swift

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

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循环完成后,即使我以10Kb的块读取数据,内存也约为300Mb。

由于某些原因,未释放块。

enter image description here

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在将数据的使用包装到autoreleasepool中之前,我曾尝试过:


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

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