1

文字列バッファとバイト配列を使用して2つのCSVファイルを作成しています。
ZipOutputStreamはzipファイルを生成するために使用します。各csvファイルには、14列の20Kレコードが含まれます。実際には、レコードはDBからフェッチされ、に格納されArrayListます。リストを繰り返し、ビルドしてバイト配列にStringBuffer変換StringBufferし、zipエントリに変換する必要があります。

レコードをに格納することから始まるプロセス全体を実行するためにJVMに必要なメモリを知りたいですArrayList
以下にコードスニペットを提供します。

StringBuffer responseBuffer = new StringBuffer();
    String response = new String();
    response = "Hello, sdksad, sfksdfjk, World, Date, ask, askdl, sdkldfkl, skldkl, sdfklklgf, sdlksldklk, dfkjsk, dsfjksj, dsjfkj, sdfjkdsfj\n";
    for(int i=0;i<20000;i++){
        responseBuffer.append(response);
    }
    response = responseBuffer.toString();
    byte[] responseArray = response.getBytes();
    res.setContentType("application/zip");
    ZipOutputStream zout = new ZipOutputStream(res.getOutputStream());
    ZipEntry parentEntry = new ZipEntry("parent.csv");
    zout.putNextEntry(parentEntry);
    zout.write(responseArray);
    zout.closeEntry();
    ZipEntry childEntry = new ZipEntry("child.csv");
    zout.putNextEntry(childEntry);
    zout.write(responseArray);
    zout.closeEntry();
    zout.close();

これを手伝ってください。前もって感謝します。

4

3 に答える 3

3

メモリ使用量を分析するには、プロファイラーを使用できます。

JProfilerまたはYourKitは、これを行うのに非常に優れています。

VisualVMもある程度良いです。

于 2012-12-16T14:53:05.153 に答える
3

StringBufferとバイト配列に割り当てられるバイト数をすでに数えようとしていると思います。ただし、問題は、CSVレコードのサイズに上限がない限り、アプリが使用するメモリの量を実際に知ることができないことです。ソフトウェアを安定させ、堅牢でスケーラブルにしたい場合は、間違った質問をしているのではないかと思います。固定量のメモリを使用して実行する必要のあるタスクを実行するように努力する必要があります。簡単に可能だと思います。

重要なのは、この場合、処理は完全にFIFOであるということです。つまり、データベースからレコードを読み取り、それらを(同じ順序で)FIFOストリームに書き込みます(OutputStreamこの場合)。zip圧縮でさえストリームベースであり、内部で一定量のメモリを使用するため、そこでは完全に安全です。

入力全体を巨大な文字列にバッファリングし、それを巨大なバイト配列に変換してから出力ストリームに書き込む代わりに、各応答要素をデータベースから個別に読み取る必要があります(または固定サイズのチャンク、たとえば100レコードで時間)、それを出力ストリームに書き込みます。何かのようなもの

res.setContentType("application/zip");
ZipOutputStream zout = new ZipOutputStream(res.getOutputStream());
ZipEntry parentEntry = new ZipEntry("parent.csv");
zout.putNextEntry(parentEntry);
while (... fetch entries ...)
    zout.write(...data...)
zout.closeEntry();

このアプローチの利点は、小さなチャンクで機能するため、サイズを簡単に見積もることができ、JVMに十分なメモリを割り当ててクラッシュしないことです。また、CSVファイルが将来2万行をはるかに超える場合でも機能することをご存知でしょう。

于 2012-12-16T14:55:10.137 に答える
0

でメモリを測定できますMemoryTestbench

http://www.javaspecialists.eu/archive/Issue029.html

この記事では、何をすべきかについて説明します。そのシンプルで、1バイトまで正確で、私はよくそれを使用します。
junitテストケースから実行することもできるので非常に便利ですが、プロファイラーはjunitテストケースから実行できませんでした。

このアプローチを使用すると、1つの整数オブジェクトのメモリサイズを測定することもできます。

しかし、zipには特別なことが1つあります。Zipstreamはネイティブcライブラリを使用します。その場合、MemoryTestbenchはそのメモリを測定せず、Java部分のみを測定します。
MemroyTestbenchとプロファイラー(jprof)の両方のバリアントを試す必要があります。

于 2012-12-16T14:53:13.470 に答える