1

私は次のようなものを持っています:

import java.util.HashMap;
import java.util.List;

public class A {
    HashMap<Long, List<B>> hashMap = new HashMap<Long, List<B>>();
}

class B{
    int a;
    int b;
    int c;
}

そして、これは巨大になるので、データベースに保存したいと思います。

HashMapにはさらに250000000のキーがあり、各キーは膨大なデータのリストを表します(たとえば、リストのサイズは約1000になる可能性があります)。

データベースからLonghashKeyを使用してBのオブジェクトのリストを取得する際に最高のパフォーマンスを得るにはどうすればよいですか?

他に何か提案はありますか?

前もって感謝します。

4

4 に答える 4

2

私には、これは2つのテーブル間の古典的な1対多または多対多の関連付けのように見えます。

各Bが1つのAのみに属している場合、テーブルAとAへの外部キーを含むテーブルBがあります。

特定のBが複数のAsに属することができる場合、テーブルA、テーブルB、および2つのテーブル間の結合テーブルがあります。

必ず外部キーにインデックスを付けてください。

于 2012-12-26T19:15:35.503 に答える
1

最大1/4億*20* 1kまたは約5TBの非常に大きなデータセットがあるため、主な問題は、メモリに保存できず、SSDに保存するには大きすぎることです。ディスクに効率的にアクセスする必要があります。そうしないと、キーごとに約8ミリ秒の遅延が発生し ます。これが主な懸念事項です。そうしないと、すべてのキーに1回ランダムにアクセスするだけで数日かかります。

メモリマップトファイルを使用してこれを実装する方法を十分に理解していない限り、データベースを使用する必要があります。これは、多数のレコードを処理するための1つの設計であることが望ましいです。また、容量だけでなく、同時に実行できるリクエストの数を増やすことができるように、より多くのスピンドルを提供するためのディスクサブシステムも必要です。

于 2012-12-26T19:36:44.270 に答える
1

infinispanを使用すると、巨大なマップを操作して、その一部(最近アクセスされていないもの)をディスクに保存してRAMを節約できます。Dレイヤー全体を書き込むよりも簡単で、(私は思うに)より速く、より少ないメモリを使用します@runtime(マップ全体がメモリに存在しません)

于 2012-12-26T19:13:31.570 に答える
0

これを1対多の関係として直接マッピングできます。2つのテーブルが必要です。1つはキーを保持するため(KeyTableと呼びます)、もう1つはBオブジェクトを保持するため(BTable)です。Bオブジェクトを含むBTableでは、KeyTableへの外部キーが必要です。次に、次のようなクエリを実行して、キー1234のオブジェクトを取得できます。

  SELECT * FROM BTABLE WHERE key=1234;

パフォーマンスのために、メモリ使用量をより適切に制御するために、HibernateのようなものではなくJDBCを使用してこれをコーディングする必要があります。

于 2012-12-26T19:13:33.927 に答える