OOMは

2017-09-27 6 views
1

私は親切に、すでに(私のファイルはzip形式で圧縮するので)Deflaterで圧縮されbyte[]を解凍したかったが、 OOMを回避するいくつかの解決策を提案する。OOMは

public static byte[] decompress(byte[] data){ 
    Inflater inflater = new Inflater(); 
     inflater.setInput(data); 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length); 
     byte[] buffer = new byte[data.length+100]; 
     while (!inflater.finished()) { 
     int count = inflater.inflate(buffer); 
     outputStream.write(buffer, 0, count); 
     } 
     outputStream.close(); 
     byte[] output = outputStream.toByteArray(); 

注:toByteArray()の内部実装について承知していますが、そのためにあらゆる選択肢を得ていません。

+0

解決方法OOM​​:JVMにメモリを追加します。 – Andreas

+1

ここでの最初の質問は、なぜByteArrayOutputStreamを使っているのですか?下流のコードが 'InputStream'で動作できないのですか? – EJP

答えて

2

全体的な目標は何ですか?

メモリ内のすべてを解凍する必要がある場合(「解凍」メソッドの戻り値とパラメータを変更できない場合)、実際にはさらにメモリを追加する必要があります。

しかし、ファイルを解凍するために必要な場合は、適切なストリームを使用して、プログラムは非常に小さなメモリで任意の大きなファイルを解凍できる必要があります(圧縮ファイルから少し読んだり解凍し、ファイルを出力するには、それを繰り返す...)。

Compressing and decompressing large size data in java?

0

あなたがメモリ内に解凍しなければならない、とあなたが圧縮された入力と膨張した出力のためだけの十分なメモリを持っていますが、あまり多くの場合は、ByteArrayOutputStream.toByteArrayは()新しいバイトを作成することを検討すべきです必要なメモリを実質的に2倍にします(byteArrayOutputStreamがガベージコレクトされるまで)。

だから、私は次のように可能であり、より多くのCPU使用率の価格のためのメモリ消費量を減少させることを考える:

  1. ストリーミングを介して入力を膨らませると、膨張したデータの正確なサイズを覚えている(と仮定し、それはです999999999)。
  2. ByteArrayOutputStreamのサブクラスを作成して内部バッファにアクセスします。
  3. インフレされたデータ(MyByteArrayOutputStream(999999999))の正確なサイズでサブクラスのインスタンスを作成し、インフレータに渡します。
  4. インフレータが完成した後、内部バッファを返します。そのときまでに膨らんだデータが保持されます。

サブクラスは、それは初めに右のサイズの内部バッファです作成するので、それがデフレの間にそれをコピーしません。また、内部バッファのサイズが適切であるため、コピーせずに呼び出し元に安全に渡すことができます。このようにして、メモリに必要なのは、入力+出力のバイト配列サイズとオーバーヘッド(ただし入力+ 2 *出力ではない)だけです。

+0

既存の回答を編集し、別の回答を作成しないでください。 – EJP

+1

これについていくつかの規制を教えてください。私はメタをチェックして、2つの解答が2つの異なる解(例えば編集されたものではない)であれば、それらが自分のメリットで判断されるべきであることを見出した。私はそれが低品質ならばあなたがそれをdownvoteすべきだと思う。 – riskop

+1

https://meta.stackoverflow.com/questions/269545/two-solutions-one-or-two-answers:「もし彼らが何も持たない完全に別々のものならそれを別々の回答として掲示するのが一番良いでしょう。それだけではなく、もっと重要なことに、コミュニティが独立して投票することができます。これにより、そのメリットをより正確に判断することができます。 – riskop

関連する問題