首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Filehandle类将整个文件加载到内存中

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

Stack Overflow用户
提问于 2019-06-17 20:11:40
回答 1查看 166关注 0票数 1

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

代码语言:javascript
复制
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
    }
}
代码语言:javascript
复制
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的区块读取数据。

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

知道会发生什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-17 20:28:48

在自动释放池中打包使用数据之前,我曾尝试过,例如:

代码语言:javascript
复制
func nextData() -> Data? {
        let data = autoreleasepool  {
            let data = self.fileHandle.readData(ofLength: 10000)
            guard !data.isEmpty else { return nil } 
            return data 
         }
        return data
    } 
 }              

我没有意识到的是,需要在里面的是阅读动作:

代码语言:javascript
复制
autoreleasepool  {
 while let data = reader.nextData() {
    print(data.count)
 }              
}

这可以正常工作。谢谢Martin的提示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56631053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档