Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在数据库中存储巨大的HashMap_Java_Database_Hashtable - Fatal编程技术网

Java 在数据库中存储巨大的HashMap

Java 在数据库中存储巨大的HashMap,java,database,hashtable,Java,Database,Hashtable,我有点像: 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中有超过25000

我有点像:

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

如何在使用长哈希键从数据库检索B对象列表时获得最佳性能

还有其他建议吗


提前感谢。

使用它,您只需使用您的大型地图,并将其部分(最近未访问的部分)存储到磁盘以节省RAM。比编写一个完整的D层更容易,而且我认为在运行时速度更快,占用的内存更少整个地图永远都不在内存中

使用它,您可以只处理您的巨大地图,并将其部分(最近未访问的部分)存储到磁盘以节省RAM。比编写一个完整的D层更容易,而且我认为在运行时速度更快,占用的内存更少整个映射永远都不在内存中

您可以直接将其映射为一对多关系。你需要两张桌子。一个用来保持键,我们称之为KeyTable,另一个用来保持B对象BTable。在使用B对象的BTable上,需要一个键表的外键。然后,您可以查询类似这样的内容,以获取具有键1234的对象:

  SELECT * FROM BTABLE WHERE key=1234;

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

您可以将其直接映射为一对多关系。你需要两张桌子。一个用来保持键,我们称之为KeyTable,另一个用来保持B对象BTable。在使用B对象的BTable上,需要一个键表的外键。然后,您可以查询类似这样的内容,以获取具有键1234的对象:

  SELECT * FROM BTABLE WHERE key=1234;

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

在我看来,这类似于两个表之间的经典一对多或多对多关联

如果每个B只属于一个A,那么您将拥有一个表A和一个包含A外键的表B

如果一个给定的B可以属于多个As,那么在两个表之间就有一个表a、一个表B和一个联接表


确保索引外键。

对我来说,这看起来像是两个表之间的经典一对多或多对多关联

如果每个B只属于一个A,那么您将拥有一个表A和一个包含A外键的表B

如果一个给定的B可以属于多个As,那么在两个表之间就有一个表a、一个表B和一个联接表


确保索引外键。

由于您有一个高达1/4 bn*20*1 k或约5 TB的非常大的数据集,您的主要问题是它无法存储在内存中,并且太大而无法存储在SSD上,因此,您必须高效地访问磁盘,否则每个密钥的延迟大约为8毫秒。这应该是您最关心的问题,否则仅随机访问每个密钥一次就需要几天的时间


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

由于您有一个高达1/4 bn*20*1 k或约5 TB的非常大的数据集,您面临的主要问题是它无法存储在内存中,并且太大而无法存储在SSD上,因此,您必须高效地访问磁盘,否则每个密钥的延迟大约为8毫秒。这应该是您最关心的问题,否则仅随机访问每个密钥一次就需要几天的时间


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

速度取决于索引列的内容。您是否也会考虑在B a、B或c元素上建立索引?谢谢Makoto,显然我会在hashkey上建立索引,因为我需要基于hashkey检索数据。您对数据库的选择是什么?这种类型的键值存储可能更适合于大型表式技术,如mcached或Riak。我正在考虑使用Microsoft SQL Server 2005,您还可以共享其他内容来将这些数据放到上下文中吗?您是随机处理还是至少按顺序处理?所有条目是否都是随机的,或者可能存在相关条目的集群?您正在查看3+Tb的数据集,除非您认为超级计算机—您的性能主要取决于通过将相关数据条目排序为彼此接近来最小化磁盘访问。从技术上讲,散列索引可以保存在内存中,因此

可能会跳过数据库性能开销。。。并不是说你的速度取决于你的索引列是什么。您是否也会考虑在B a、B或c元素上建立索引?谢谢Makoto,显然我会在hashkey上建立索引,因为我需要基于hashkey检索数据。您对数据库的选择是什么?这种类型的键值存储可能更适合于大型表式技术,如mcached或Riak。我正在考虑使用Microsoft SQL Server 2005,您还可以共享其他内容来将这些数据放到上下文中吗?您是随机处理还是至少按顺序处理?所有条目是否都是随机的,或者可能存在相关条目的集群?您正在查看3+Tb的数据集,除非您认为超级计算机—您的性能主要取决于通过将相关数据条目排序为彼此接近来最小化磁盘访问。从技术上讲,散列索引可以保存在内存中,所以从技术上讲,可以跳过数据库性能开销。。。并不是说你不应该忘记n-n而只是复制微小的Astank JB,我在哈希表中有很多B到1的哈希键。我不会有任何B到多个hashKey的关系。那么在表A中,我将随哈希键一起存储什么?如果除了哈希键之外没有其他内容,那么B只需要一个表。我误读了代码,认为您有其他与哈希键相关的属性。您好,JB,但是我如何使用一个哈希键存储多个B呢。我希望hashKey作为主键,我将索引数据库以获得最佳检索性能。我将仅基于hashKey对记录进行fetch。我该怎么做?我确信我们不能用一个主键hashKey来存储多个Bs。你可以为同一个主键存储任意数量的Bs,只是不能使它成为唯一的键。顺便说一句,除非添加一列来存储,否则无法保证数据库中的顺序。一个列表意味着你想要一个有序的集合,或者忘记n-n,只是复制一个很小的数组JB,我在哈希表中有很多B到1的哈希键。我不会有任何B到多个hashKey的关系。那么在表A中,我将随哈希键一起存储什么?如果除了哈希键之外没有其他内容,那么B只需要一个表。我误读了代码,认为您有其他与哈希键相关的属性。您好,JB,但是我如何使用一个哈希键存储多个B呢。我希望hashKey作为主键,我将索引数据库以获得最佳检索性能。我将仅基于hashKey对记录进行fetch。我该怎么做?我确信我们不能用一个主键hashKey来存储多个Bs。你可以为同一个主键存储任意数量的Bs,只是不能使它成为唯一的键。顺便说一句,除非添加一列来存储,否则无法保证数据库中的顺序。列表意味着你想要一个有序的集合嗨,彼得,谢谢你的计算。。我可能算错了。我正在做的是用Java实现音频指纹。我每秒采集10首原创歌曲的样本。因此,我将有600个样本,每1分钟播放任何歌曲。我想要50000首歌,每首歌大约5-7分钟。好的,你有50K首歌的样本*500秒*10个样本/秒,总共是25000000个样本,或者如果你有16位,大约500MB。我假设你需要能够非常有效地查找任何值,所以你应该考虑一个可以在java内存中存储或关闭HeAPUI的数据结构,你应该考虑到你的低信噪比意味着你需要执行最接近的匹配。哈希表只能用于精确匹配。是的,对于精确匹配,我使用模糊计算将稍微扭曲的键合并到HashMapHi Peter中的单个键,谢谢计算。。我可能算错了。我正在做的是用Java实现音频指纹。我每秒采集10首原创歌曲的样本。因此,我将有600个样本,每1分钟播放任何歌曲。我想要50000首歌,每首歌大约5-7分钟。好的,你有50K首歌的样本*500秒*10个样本/秒,总共是25000000个样本,或者如果你有16位,大约500MB。我假设你需要能够非常有效地查找任何值,所以你应该考虑一个可以在java内存中存储或关闭HeAPUI的数据结构,你应该考虑到你的低信噪比意味着你需要执行最接近的匹配。哈希表只能用于精确匹配。是的,对于精确匹配,我使用模糊计算将稍微扭曲的键合并到HashMap中的单个键