Ios Filehandle类将整个文件加载到内存中
我试图按顺序从大文件中读取数据。由于文件可能比可用内存大,我不希望文件完全加载到内存中Ios Filehandle类将整个文件加载到内存中,ios,swift,Ios,Swift,我试图按顺序从大文件中读取数据。由于文件可能比可用内存大,我不希望文件完全加载到内存中 类记录导入器{ func`import`(url:url){ guard let reader=RecordReader(url:url)else{return} 个人简历(发件人:读者) } 私人func简历(来自读卡器:RecordReader){ 而let=reader.nextData(){ } //这里的检查内存大约是300Mb,即测试文件大小。 返回 } } 类记录读取器{ 私有变量fi
类记录导入器{
func`import`(url:url){
guard let reader=RecordReader(url:url)else{return}
个人简历(发件人:读者)
}
私人func简历(来自读卡器:RecordReader){
而let=reader.nextData(){
}
//这里的检查内存大约是300Mb,即测试文件大小。
返回
}
}
类记录读取器{
私有变量fileHandle:fileHandle
初始化?(url:url){
做{
self.fileHandle=try fileHandle(forReadingFrom:url)
}
抓住{
归零
}
}
func nextData()->数据{
让data=self.fileHandle.readData(长度:10000)
guard!data.isEmpty else{return nil}
返回数据
}
}
while循环完成后,内存大约为300Mb,尽管我正在读取10Kb的数据块
由于某些原因,块没有被释放
知道会发生什么吗?在将数据打包到自动释放池之前,我已经尝试过,比如:
func nextData()->数据?{
让数据=自动释放池{
让data=self.fileHandle.readData(长度:10000)
guard!data.isEmpty else{return nil}
返回数据
}
返回数据
}
}
我没有意识到的是,阅读是一种需要在里面的行为:
autoreleasepool{
而let data=reader.nextData(){
打印(数据计数)
}
}
这是正确的。感谢Martin的提示。您可能应该阅读本地自动释放池中的每个区块可能的副本。