1

CSV ファイルで動作するスイング アプリケーションがあります。ファイル全体を 1 行ずつ読み取り、必要な統計を計算し、出力を表示します。出力画面の上部には、ファイルの各レコードが JTable にその順序で表示され、下部にはそのデータに基づいて計算された統計が表示されます。問題は、JVM がファイル サイズの 4 倍のメモリを消費することです。(86MB のファイル ヒープ領域を処理している間、377MB のスペースが使用されます - メモリ使用率は jVisualVM を使用してチェックされます)。

ノート:

  1. ファイルの読み取りに LineNumberReader を使用しました(特定の要件があるため、メモリ使用量に役立つ場合は変更できます)

  2. すべての行を読み取るために readLine() が使用され、そのレコードの個々のフィールドに対して文字列であるその行の .split(',') が呼び出されます。

  3. 各レコードは Vector に格納されて JTable に表示されますが、他の統計は JavaBean クラスの HashMap、TreeMap、および要約データに格納されます。また、JFreeChart を使用して 1 つのグラフがプロットされます。

2GB のファイルを処理する必要があるため、メモリ使用率を下げることを提案してください。

4

4 に答える 4

1

OpenCSVを試してみてください。readNext() メソッドを使用すると、最後に読み取った行のみが保存されます。大きなファイルの場合、これは完璧です。

彼らのウェブサイトから、彼らがサポートする機能は次のとおりです。

  • 1 行あたりの任意の数の値

  • 引用された要素のコンマを無視する

  • キャリッジ リターンが埋め込まれた引用エントリ (つまり、複数行にわたるエントリ) の処理

  • 構成可能な区切り文字と引用符 (または実用的なデフォルトを使用)

  • 一度にすべてのエントリを読み取るか、Iterator スタイル モデルを使用します

  • String[] からの csv ファイルの作成 (つまり、埋め込まれた引用文字の自動エスケープ)

于 2012-04-24T17:51:17.877 に答える
0

ベスト プラクティスを使用してプログラムをアップグレードする

  1. プログラムにマルチスレッドを記述して、CPU 使用率を向上させます。
  2. ヒープの最小サイズと最大サイズを設定して、RAM をより有効に活用します。
  3. 適切なデータ構造と設計を使用してください。
于 2012-04-24T17:43:54.793 に答える
0

すべての Java オブジェクトにはメモリ オーバーヘッドがあるため、文字列が非常に短い場合、ファイルのサイズが 4 倍になる理由を説明できます。Vector とその内部のサイズも計算する必要があります。MapJava Strings は可能な限りメモリ内の同じアドレスを指そうとしているため、メモリ使用量が改善されるとは思いません。

設計を見直したほうがいいと思います。あなたの要件を考えると

出力画面の上部には、ファイルの各レコードが JTable の順序で表示され、下部にはそのデータに基づいて計算された統計が表示されます。

ファイル全体をメモリに保存する必要はありません。統計を計算するには、それを完全に読み取る必要があります。これは、非常に少量のメモリを使用して実行できます。JTable 部分に関しては、プログラムに 2GB のヒープ領域を必要とせずに、さまざまな方法でこれを実現できます。誰かが CSV をメモリに保持したい場合、何か問題があるに違いないと思います! Apache IO LineIterator

于 2012-04-24T18:28:58.723 に答える
0

JVM ヒープ サイズを増やします (-Xms および -Xmx)。記憶があるなら、これが最善の解決策です。それができない場合は、データ モデルとプレゼンテーション (GUI) の変更を組み合わせた妥協点を見つける必要があります。通常、コードの複雑さが増し、バグが発生する可能性があります。

  1. 統計アルゴリズムを変更して、データが読み取られているときに作業を行い、すべてがメモリに存在する必要がないことを試してください。統計を概算するアルゴリズムで十分であることがわかる場合があります。
  2. データに重複した文字列リテラルが多数含まれている場合は、HashSet を使用してキャッシュを作成します。キャッシュはメモリ リークの原因となることで有名です (たとえば、別のファイルをロードする前にキャッシュをクリアしないなど)。
  3. グラフに表示されるデータの量を減らします。多くのデータを含むグラフでは、同じピクセルまたはその近くに多くのポイントが表示されるのが一般的です。X 軸上の同じ位置またはその近くにある複数の値をマージして、データを切り捨てることを検討してください。たとえば、データ セットに 2,000,000 個のポイントが含まれている場合、それらのほとんどは他の近くのポイントと一致するため、基になるデータ モデルにすべてを格納する必要はありません。
  4. 情報過多に注意。JTable に 2GB 相当のデータが含まれている場合、その JTable はユーザーにとって意味がありますか? おそらく、テーブルをページ分割し、ファイルから一度に 1000 エントリだけを読み取って表示する必要があります。
  5. これを提案するのはためらっていますが、読み込みプロセス中に CSV データをファイル データベース ( cdbなど) に変換できます。上記で提案したように、変換中に統計を蓄積してグラフ用のデータを保存し、データベースを使用して JTable のデータのページを一度にすばやく読み取ることができます。
于 2012-04-24T18:59:39.010 に答える