0

ファイル:
3.3mio行のデータを含む検索ログファイルの洗練されたcsvバージョンを使用しています。各行は単一のクエリに似ており、そのクエリに関するさまざまなデータが含まれています。ファイル内のエントリは、セッション/ユーザーIDの昇順で並べ替えられます。

目標:
同じユーザーIDに属しているときに同じクエリ用語を送信したエントリを結合する

アプローチ:
csvファイルを1行ずつ読み取り、データを自作の「エントリ」オブジェクトに保存し、これらのオブジェクトを配列リストに追加しています。これが完了したら、カスタムコンパレータを使用してリストを2つの基準で並べ替えます

問題:

行を読み取り、Entry-objectsをリストに追加している間(非常に時間がかかります)、プログラムはOutOfMemoryException"Javaheap"で終了します。


ですから、私のアプローチはメモリ(およびランタイム)に対して難しすぎるようです。
より良いアプローチのためのアイデアはありますか?

4

2 に答える 2

2

あなたのアプローチ自体は有効かもしれません、そしておそらく最も簡単な解決策は単にJVMに利用可能なメモリを増やすことです。

JVMは、それ自体に最大量のシステムメモリのみを割り当てます。この値は、-Xmxコマンドライン属性を介して増やすことができます。詳細については、こちらをご覧ください。

明らかに、このソリューションは拡張性がなく、(将来的に)はるかに大きなファイルを読み取りたい場合は、これらのファイルを読み取るためのより良いソリューションが必要になる可能性があります。

于 2012-06-26T15:44:10.440 に答える
1

メモリ内の行を並べ替える代わりに、重複を定義する列に基づくインデックスを使用して、解析された行をデータベースに挿入できます。

別のアプローチは、多くのファイルの行をディスパッチすることです。各ファイルは、たとえば、重複を定義する連結列のsha1の最初の2文字として名前が付けられます。したがって、すべての重複が一緒になるため、最終的な操作のために複数のファイルを読み取る必要はありません。

于 2012-06-26T15:44:41.590 に答える