3

大規模なデータセットに対していくつかの実験を行っており、特定の部分を最適化したいと考えています。現在、5 ~ 6 個の s があり、それぞれに s からs へのModelマッピングが格納されています。sのセットは大きく、各 間で同じであるため、より良い方法があるはずです。最終的に実行する必要があるクエリは次のとおりです。 for some -組み合わせの位置 x は何ですか。TopicListStringTopicModelStringListModelTopic

マッピング方法を使用する際の問題の 1 つは、たとえば 500k-5M のトピックがある場合、それぞれに 20 個の文字列のリストがあることです。それから私のMap<Model, Map<Topic, List<String>>>ものは大規模になるでしょう。

4

5 に答える 5

1

Topicとを使用Modelして、単一のマップで複合キーを作成できます。

map.put(topic1_id + model1_id, list1_1);
map.put(topic1_id + model2_id, list1_2);
...
map.get(topic_id + model_id)

ここで、IDは文字列です(または同様のスキームを数値識別子で使用できます)。

同様のアプローチは、各トピックを割り当てて一意の番号をモデル化し、文字列のリストを配列に格納することです。したがって、特定の組み合わせのリストを検索するには、2つのインデックスを検索し、2D配列の特定の場所にアクセスします。 。(ただし、データ構造を構築する前にトピックとモデルの数を知っていると、これは簡単です)

メモリ効率については、細部も考慮してください。一般に、オブジェクトの数を最小限に抑える必要があります。各オブジェクトにはオーバーヘッドがあります。ArrayListは動的に大きくなるため、多くの無駄なスペースが発生する可能性があり、現在の容量を超えるとサイズが2倍になります。それらを必要な容量に事前にサイズ設定できる(または代わりにアレイを使用できる)場合は、多くのメモリを節約できます。同じことが、多数の小さなHashMapを使用する場合にも当てはまります。

于 2012-10-19T21:50:36.930 に答える
1

SortedSet / Maps を試しましたか? 検索を最適化する必要があるようですね。通常のリストは O(1) ですが、並べ替えられたコレクション (TreeMap など) は log(n) にする必要があります。もちろん、この種のことはデータベースが得意とするものです...

于 2012-10-19T21:37:50.837 に答える
1

「メモリ効率」をどこで/どのように達成したいのか明確ではありません。最初に、詳細なデータの詳細を見て、消費するストレージの量を確認し、次にそれを整理するさまざまな方法を調べて、「実際の」データに対するオーバーヘッドの割合で効率を分析する必要があります。

関連するテーブルを考慮すると、HashMap にはエントリごとに約 80 バイトのオーバーヘッドがあることがわかります。ArrayList は、平均して約 10 ~ 12 に見えます。見なくても、TreeMap は HashMap よりも多く、おそらく 100 になると思います。

一般的に言えば、独自のオブジェクト内のリンクは、これらの集約オブジェクトを使用するリンクよりも、ストレージとアクセス速度の両方で「安価」になります。しかし、集約オブジェクトは使いやすく、ある程度「最適化」されています。

(しかし、あなたの更新を見ると、すべてをヒープに保持するのではなく、おそらく DB アプリケーションを見ているは​​ずです。)

于 2012-10-19T21:58:03.807 に答える
0

String[][][]言及されていないもう1つの可能性は、モデルとトピックを使用して文字列を保存し、クエリ時に次のListようにすることです。ArrayList

public String query(Model model, Topic topic, int x) {
   return strings[models.indexOf(model)][topics.indexOf(topic)][x];
}

トピックとモデルがソートされている場合は、速度がさらに向上し、バイナリ検索indexOfを使用することはできません。

于 2012-10-19T22:28:34.163 に答える