9

JavaクラスZipOutputStreamを介して1つの大きなファイル(〜450 Mバイト)を圧縮する必要があります。この大きなディメンションにより、JVMヒープスペースの「OutOfMemory」エラーの問題が発生します。これは、「zos.write(...)」メソッドが、圧縮する前に圧縮するすべてのファイルコンテンツを内部バイト配列に格納するために発生します。

            origin = new BufferedInputStream(fi, BUFFER);
        ZipEntry entry = new ZipEntry(filePath);
        zos.putNextEntry(entry);

        int count;
        while ((count = origin.read(data, 0, BUFFER)) != -1)
        {
            zos.write(data, 0, count);
        }
        origin.close();

自然な解決策はJVMのヒープメモリスペースを拡大することですが、このデータをストリーミング方式で書き込む方法があるかどうかを知りたいと思います。高い圧縮率は必要ないので、アルゴリズムも変更できます。

誰かがそれについて考えを持っていますか?

4

4 に答える 4

11

サムの応答に対するあなたのコメントによると、あなたは明らかにByteArrayOutputStreamをラップするZipOutputStreamを作成しました。もちろん、ByteArrayOutputStreamは圧縮された結果をメモリにキャッシュします。ディスクに書き込む場合は、ZipOutputStreamをFileOutputStreamにラップする必要があります。

于 2009-11-20T14:59:35.543 に答える
3

この種のことを行うために過去に成功を収めて使用したTrueZipというライブラリがあります。

バッファリングの面でそれがうまくいくことを保証することはできません。JDKのZipAPIに依存するのではなく、独自のコーディングで多くのことを実行することを私は知っています。

ですから、私の意見では、試してみる価値があります。

于 2009-11-20T14:35:37.597 に答える
1

ZipOutputStreamはストリームベースであり、メモリを保持しません。BUFFERが大きすぎる可能性があります。

于 2009-11-20T14:35:46.823 に答える
0

コンテンツをZipEntryに保存しているためか、おそらくZipEntryを書き出す前にすべてのコンテンツをロードするのではないでしょうか。Zipを使用する必要がありますか?圧縮する必要があるデータストリームが1つだけの場合は、代わりにGZIPOutputStreamを調べることができます。同じ問題はないと思います。

お役に立てれば。

于 2009-11-20T14:42:58.877 に答える