2

100000 以上のファイルを含む zip ファイルからファイルを読み取る必要があり、Java 1.6 を使用しているため、当面は Apache commons 圧縮ライブラリを使用します。ただし、ZipFile() のコンストラクターが戻るまでに約 30 秒かかります。(私が使用しているマシンはかなり古いもので、8 GB RAM の C2D E6550 であることは認めますが、zip ファイルのファイル数が 65535 未満の場合、コンストラクターはほとんどすぐに戻ります)

私たちのプログラムは非常に頻繁に zip ファイルを開き、ZipFile コンストラクターにかかる時間が長すぎるため、スピードアップする必要があります。2 つのオプションがあります。1) zip ファイルを、それぞれが 65535 個未満のファイルを持つボリュームに分割するか、2) ZipFile オブジェクトをキャッシュして再利用します。

ただし、どちらもかなりの量のリファクタリング/リライトが必要なので、どちらかのソリューションに進む前に、別のライブラリで zipfile の読み取りを高速化する方法はありますか、それとも Apache commons 圧縮で何か問題がありますか? これは、zipfile オブジェクトを作成する方法です。

final File f =  new File(zipFileName);
if(f.exists() == false)
    throw new FileNotFoundException(zipFileName);
ZipFile zip = new ZipFile(f);

この問題を攻撃する方法について何か考えはありますか?

4

1 に答える 1

1

ソース コードを見ると、zipfile を開き、すべてのエントリをすぐに読み込んでいます。この情報は、ユースケースに適したサイズではない内部ハッシュマップに保存されます。すべての再ハッシュが問題になる可能性があります。しかし、確かなことは難しいです。プロファイラーで実行して、どこで時間が費やされているかを確認する必要があります。

また、apache commons のソースを入手して独自のバージョンを作成することもできます。これにより、初期サイズを制御して、それが役立つかどうかを確認できます。

そうでない場合は、いつでもこのオブジェクトを別のスレッドで構築し、構築中に別の便利なことを行うことができます。

于 2012-11-06T18:04:09.613 に答える