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 左右)。

如何在从数据库中检索具有 Long hashKey 的 B 对象列表时获得最佳性能?

还有其他建议吗?

提前致谢。

4

4 回答 4

2

To me, this looks like a classical One-To-Many or Many-To-Many association between two tables.

If each B belongs to only one A, then you would have a table A and a table B containing a foreign key to A.

If a given B can belong to multiple As, then you would have a table A, a table B, and a join table between the two tables.

Make sure to index the foreign keys.

于 2012-12-26T19:15:35.503 回答
1

由于您拥有高达 1/4 亿 * 20 * 1 k 或大约 5 TB 的非常大的数据集,因此您遇到的主要问题是它无法存储在内存中并且太大而无法存储在 SSD 上,所以您必须有效地访问磁盘,否则每个键的延迟大约为 8毫秒

除非您非常了解如何使用内存映射文件来实现这一点,否则您将需要使用数据库,最好使用一种设计来处理大量记录。您还需要一个磁盘子系统,不仅是为了提高容量,还要为您提供更多的心轴,这样您就可以增加可以并发执行的请求数量。

于 2012-12-26T19:36:44.270 回答
1

使用infinispan,您可以只使用巨大的地图并将其中的一部分(最近未访问的)存储到磁盘以节省 RAM。比编写整个 D 层更容易,并且(我认为)更快并且使用更少的内存@runtime(整个地图从来没有在内存中)

于 2012-12-26T19:13:31.570 回答
0

您可以将其直接映射为一对多关系。你需要两张桌子。一个保存密钥(我们称之为 KeyTable),另一个保存 B 对象(BTable)。在具有 B 对象的 BTable 上,您需要 KeyTable 的外键。然后你可以查询这样的东西来获取键为 1234 的对象:

  SELECT * FROM BTABLE WHERE key=1234;

为了提高性能,您可能应该使用 JDBC 而不是 Hibernate 之类的代码来编写代码,以便更好地控制内存使用。

于 2012-12-26T19:13:33.927 回答