0

大きなファイル(> 150MB)を読み取って、ファイルの内容をとして返そうとしていますByteArrayOutputStream。これは私のコードです...

private ByteArrayOutputStream readfileContent(String url) throws IOException{

    log.info("Entering readfileContent ");
    ByteArrayOutputStream writer=null;
    FileInputStream reader=null;

    try{
        reader = new FileInputStream(url);
        writer = new ByteArrayOutputStream();

        byte[] buffer = new byte[1024];

        int bytesRead = reader.read(buffer);
        while (bytesRead =  > -1) { 
            writer.write(buffer, 0, bytesRead);
            buffer = new byte[1024];
        }

    }
    finally {
        writer.close();
    }

    log.info("Exiting readfileContent ");
    return writer;
}

取得していjava.lang.OutOfMemoryError: Java heap space exceptionます。Javaヒープサイズを増やしてみましたが、それでも発生します。誰かがこの問題を手伝ってくれませんか。

4

5 に答える 5

1

を返し、BufferedInputStream発信者にそれを読み取らせる必要があります。あなたがしているのは、ファイル全体をとしてメモリにコピーすることですByteArrayOutputStream

あなたの質問には、ファイルの内容で何をしたいのかが欠けています。それがなければ、推測することしかできません。ServletOutputStreamコメントアウトがあります。もともとこれに書きたいですか?代わりにこれに書き込むことは機能するByteArrayOutputStreamはずです。

于 2012-05-10T12:01:04.053 に答える
1

whileループにエラーがあります。に変更します

 while (bytesRead >= -1) { 
     writer.write(buffer, 0, bytesRead);
     bytesRead = reader.read(buffer);
 }

また、閉じることを忘れないでくださいreader

(それでもかなりの量のメモリが必要になります。)

于 2012-05-10T14:17:08.413 に答える
0

読み取るバイト数がわかっているのでByteArrayOutputStream、サイズを使用してを作成することにより、時間とスペースを節約できます。ByteArrayOutputStreamこれにより、バッキングストレージを「拡張」する時間とスペースのオーバーヘッドを節約できます。(私はコードを見ていませんが、おそらくと同じ戦略を使用していStringBuilderます。つまり、割り当てがなくなるたびに割り当てを2倍にします。その戦略は、ピーク使用時に最大3倍のファイルサイズを使用することになります。)

(率直に言って、サイズがわかっているときに出力をに入れるのはByteArrayOutputStream無意味に思えます。十分な大きさのバイト配列を割り当てて、そこに直接読み込むだけです。)

それとは別に、答えはヒープを大きくする必要があるということです。

于 2012-05-10T12:02:40.610 に答える
0

あなたのアプローチでは、少なくともファイルと同じ量のメモリを使用しますが、ByteArrayOutputStreamはストレージとしてバイト配列を使用しているため、150,000倍(150メガ/ 1024kバッファ)のサイズ変更が必要になる可能性があり、効率的ではありません。ヒープサイズをファイルサイズの2*に増やし、bufのサイズをはるかに大きいサイズに増やすと、実行できる可能性がありますが、他の投稿者が述べているように、ファイルを読み取るよりも、ファイルを読み進める方がはるかに優れています。文字列として。

于 2012-05-10T12:05:11.327 に答える
0

ホストに十分な連続仮想メモリがないことが原因で、WindowsのC#で同様の問題が発生しました。Windowsを使用している場合は、VMスペースを増やしてみてください。

于 2012-05-10T14:25:06.643 に答える