複数のファイルを単一のzipアーカイブに圧縮しようとしていますが、メモリ不足の警告が表示されます。完全なzipファイルがメモリにロードされるので、それが問題だと思います。ZipArchiveを使用して圧縮/解凍をより適切に管理し、すべてのデータが一度にメモリに保存されないようにする方法はありますか?
ありがとう!
複数のファイルを単一のzipアーカイブに圧縮しようとしていますが、メモリ不足の警告が表示されます。完全なzipファイルがメモリにロードされるので、それが問題だと思います。ZipArchiveを使用して圧縮/解凍をより適切に管理し、すべてのデータが一度にメモリに保存されないようにする方法はありますか?
ありがとう!
ZipArchiveの代替案について調査した後、ZipArchiveよりも少し優れていると思われるObjective-zipという別のプロジェクトを見つけました。リンクは次のとおりです。
http://code.google.com/p/objective-zip/
APIは非常にシンプルです。私が遭遇したことの1つは、物乞いでデータを読み取っていて、決して解放しなかったということでした。そのため、zipファイルに大量の大きなファイルを追加する場合は、データを解放することを忘れないでください。これが私が使用した小さなコードです:
ZipFile * zipFile = [[ZipFile alloc] initWithFileName:archivePath mode:ZipFileModeCreate]; for(NSString *サブパスのパス){ NSData * data = [[NSData alloc] initWithContentsOfFile:longPath]; ZipWriteStream * stream = [zipFile writeFileInZipWithName:path CompressionLevel:ZipCompressionLevelNone]; [ストリームwriteData:data]; [ストリームfinishedWriting]; [データリリース]; } [zipFile close]; [zipFileリリース];
これが同じ問題に遭遇した人に役立つことを願っています。
これに対処する簡単な方法は、ファイルをNSDataに読み込むZipArchiveの方法を変更することです。次のコードを変更するだけです
data = [ NSData dataWithContentsOfFile:file ];
に
data = [ NSData dataWithContentsOfMappedFile:file ];
これにより、OSはメモリマップされた方法でファイルを読み取ります。基本的に、すべてを一度にメモリにロードするのではなく、必要に応じてファイルから読み取るときに使用するメモリがはるかに少なくなります。