2

メモリ内のハッシュテーブルに1400万行の大きなファイルをロードしようとしています。各行には3つの数字(n、m、v)が含まれています。ここで、

  • n:ユーザー(オブジェクト)のIDです
  • m:アイテム(オブジェクト)のIDです
  • v:ユーザーnがアイテムmに与えるレートです。

各ユーザーnには、ユーザーが評価したアイテムを保存するためのhashtable<item, rate>があり、各アイテムには、hashtable<user, rate>このアイテムを評価したユーザーを保存するためのがあります。

私のマシンでは、この構造をメモリにロードできないため、毎回ヒープメモリエラーが発生します。

ハッシュテーブルをhashBasedTableに置き換えようとしました。これにより、値ごとに2つのキーが許可されますが、解決策はありません。さらに、hashBasedTableは私のプログラムをはるかに遅くしました。

この大量のデータをロードできるようにするための解決策はありますか?

4

4 に答える 4

2

それぞれ3つの数字の1400万行は、大規模なデータ配列のようには聞こえません。約14M*(3 + 1)* 8〜450Mまたはメモリです。

-Xmx設定を十分に大きい値に設定していることを確認してください(たとえば、-Xmx1024m-これにより、JVMは最大1GのRAMを割り当てることができます)。

HashMapPS私は代わりに提案したいと思いHashTableます。

于 2012-10-28T02:52:18.947 に答える
1

とを使用して、各評価項目のユーザーと各ユーザーの評価項目をそれぞれ表すことをお勧めしArrayList<User>ますArrayList<Item>。それは多くのスペースを節約します。

確かに、一部の操作は現在実行されますO(N)が、それは大きくなった場合にのみ問題Nになります。(もしそうなら、あなたArrayListが小さな関係とHashMap大きな関係のために使うハイブリッドを考えてください。)

提案#2-プレーン配列を使用します...そして、バイナリ検索を使用してルックアップを実装できるように、それらをソートしたままにします。これはコード集約的です(つまり、より複雑です)が、コレクションタイプを使用するよりもメモリ使用量が多くなります。

提案#3-データベースを使用します。スケーリングが向上します。

于 2012-10-28T03:10:24.350 に答える
0

使用するデータ構造に依存するとは思いません。それほど多くのデータをRAMにロードすることはできません。ファイルを1行ずつ処理し、使用しているロジックを実行する必要があります。

于 2012-10-28T02:28:13.263 に答える
0

アクセスパターンについては少しわかりませんが、ユーザーごとおよびアイテムごとに1つではなく、1つの大きなテーブルを使用したいようです。特に、データが非常に少ない場合(ユーザーごとに数個のアイテムのみ、またはその逆の場合)、ハッシュテーブルの初期容量のために多くのスペースを浪費します(初期容量を下げたり、負荷率を上げたりすることができます)。現在の組織を維持したい場合)。

単一の大きなハッシュテーブルのキーとして使用するペアオブジェクト(ユーザーID、アイテムID)を作成します。列挙が必要な場合(つまり、ユーザーのすべてのアイテムを一覧表示する、またはその逆)、ArrayListそのデータを保持しtrimToSizeて、ハッシュテーブルよりもはるかにコンパクトに使用します。

于 2012-10-28T02:59:13.157 に答える