Java 什么时候是大的,足够大的数据库?

Java 什么时候是大的,足够大的数据库?,java,database,sqlite,hashmap,Java,Database,Sqlite,Hashmap,我正在开发一个以性能为核心的Java应用程序。 我有一份约40000个“最终”物体的清单, i、 例如,我有40000个向量的初始化输入数据。 该数据在程序运行期间保持不变 我总是对单个ID属性进行查找,以检索正确的向量。 目前,我在1000个向量的子样本上使用HashMap, 但是 我不确定它是否能大规模生产 什么时候是大的,实际上大到可以使用DB? 还有一件事,SQLite DB是一个可行的选择,因为它不涉及并发性, 因此,我猜db使用的“阈值”可能更低。只要在程序开始时将数据集加载到内存中

我正在开发一个以性能为核心的Java应用程序。 我有一份约40000个“最终”物体的清单, i、 例如,我有40000个向量的初始化输入数据。 该数据在程序运行期间保持不变

我总是对单个ID属性进行查找,以检索正确的向量。 目前,我在1000个向量的子样本上使用
HashMap
, 但是 我不确定它是否能大规模生产

什么时候是大的,实际上大到可以使用DB? 还有一件事,SQLite DB是一个可行的选择,因为它不涉及并发性,
因此,我猜db使用的“阈值”可能更低。

只要在程序开始时将数据集加载到内存中,并将其保留在内存中,并且没有任何复杂的查询,某种序列化/反序列化似乎比完整的数据库更可行。

我想你是在问一个包含40000个条目的
HashMap是否可以。答案是肯定的——除非你真的没有足够的记忆力,否则这绝对没问题。如果您正在编写一个性能敏感的应用程序,那么在运行该应用程序的机器中放入大量快速内存可能是提高性能的有效方法

每个
HashMap
条目不会有太大的开销,因此如果您有足够的空间将对象本身存储在内存中,那么映射的开销不太可能导致问题

有什么理由不能用合理数量的数据来测试这一点吗

如果你真的没有更多的要求,除了:

  • 启动时读取数据
  • 通过单个ID将数据放入映射中(不需要连接、对不同字段的查询、子字符串匹配等)
  • 从地图中提取数据

。。。在我看来,使用一个成熟的数据库将是一个巨大的过度消耗。

你可以用100(或更少)的数据创建一个数据库。对于何时数据量大到足以存储在数据库中,没有通用规则。如果您认为应该更好地将这些数据存储在数据库中,并且这会给您带来任何好处(性能提升、编程更简单、用户的选择更灵活),那么这就更重要了


当收益大于实施成本时,将其放入数据库。

对于集合和数据库,没有设置大小。这取决于您想对数据做什么。大小不那么重要


你可以拥有一个有十亿个条目的地图

没有“足够大的数据库”这样的东西。问题是使用数据库是否有足够的优势来克服成本


话虽如此,40000不是“大”;-)除非对象很大或者您有复杂的查询需求,否则我将从内存实现开始。但是如果你希望随着时间的推移来放大这个数字,最好从一开始就使用这个数据库。

< P>你可能要考虑的一个选项是Oracle伯克利DB java版本库。它是一个简单的JAR文件,可以将数据读/写到持久存储。由于它占地面积小且易于使用,因此可用于运行在小到非常大的数据集上的应用程序。它被设计为链接到应用程序中,因此它是嵌入式的,不需要复杂的客户机/服务器安装或协议栈

更好的是,它的可伸缩性非常强(如果最终得到的数据集比预期的大,那么它就可以很好地工作),速度非常快,并且支持Java集合API和直接持久层API(类似POJO)。因此,您可以将其无缝地用于Java集合

Berkeley DB Java Edition是专门为Java应用程序开发人员设计的。它的设计目的是简单易用,所需资源重量轻,但速度快、可扩展且可靠

您可以找到有关Oracle Berkeley DB Java Edition的更多信息

问候,


Dave

(a)我不能添加内存,因为它将在许多机器上运行。这是一个终端用户应用程序,不是服务器应用程序。(b) 我还不能用超过1000个向量进行测试。这些向量是复杂机器学习的产物,现在还没有出现。@David:你不能为了测试而复制数据40次吗?@@Skeet:我真的不希望复制数据。标签(其中40K)为英语单词。如果我将随机词分配给我已经拥有的向量,我可能不会得到相同的预期时间成本。这与真实(野外)语料库中单词的共性/稀有性有关。@David:那么你真的不知道真实数据的大小吗?我希望这些词本身不会有什么意义——它将是占据空间的向量。每个向量在内存中有多大?@@@Skeet:我采用了你的方法。采集一天的相似数据。不是很相似,但是“samish”。比例很好。10倍。