1

解決済み-手動管理(ガベージコレクターをバイパスする)とマップされたNSDataオプションの組み合わせを使用しました結局のところ、iStatには正しいメモリの数値がなく、Instrumentsは期待される動作を示していました。さらに、CC_MD5()およびCC_SHA1()呼び出しは、実際にはすでにCC_MD5_Update()およびCC_SHA1_Update()を呼び出しているため、どちらも問題を引き起こしていません。

私は現在、SHA-1とMD5を使用して大量のファイルをハッシュする必要があるCocoaアプリケーションに取り組んでいます。CC_MD5とCC_SHA1を使用しており、ファイルをNSDataオブジェクトに読み込んでいます。ただし、これは大量のRAMを使用し、NSDataオブジェクトが参照されていなくても、何らかの理由でふるいのようにメモリをリークします…ガベージコレクターが追いつくのに苦労しているのではないかと思います。

このような大規模なファイルに対してMD5およびSHA-1ハッシュを実行するための最良の方法(可能な場合は最も簡単ですが、速度を上げるために余分な作業を行うことを嫌がりません)は何ですか?

ファローアップ

以下で説明するように、マップされたNSDataが役立つ場合がありますが、別のオプションを見つけたと思います。それでもいくつかの作業が必要ですが、はるかに堅牢なソリューションのようです。アイデアは、NSFileHandleを使用して「チャンク」を読み取ることです。したがって、一度に最大256MBになる可能性があります。次に(たとえばMD5の場合)CC_MD5()を使用し、続いて一連のCC_MD5_Update()を使用して、ハッシュをチャンクで計算します。それを手動のメモリ管理と組み合わせると役立つはずです。

4

1 に答える 1

3

メモリマップトファイルを使用していますか?そうすれば、ファイル全体をメモリに読み込む必要がなく、OSが必要なもののキャッシュを処理します。

[NSData dataWithContentsOfFile:@"filename.dat" 
                       options:NSDataReadingMappedIfSafe 
                         error:&error];

(NSDataReadingMappedAlwaysを使用してメモリマッピングを強制することもできます)

于 2011-10-06T09:46:59.003 に答える