使用内存数据库存储数百万个临时值的效率如何?

我的应用程序目前存储数百万个Double元素进行计算。 这些值在用于计算结束时运行的特定算法之前只是临时值。 完成此计算后,可以丢弃数百万个值。

如果您需要更多细节,完整的故事就在这里 。

提出的解决方案之一是使用内存数据库。

因此,如果我使用此解决方案,我将使用此数据库将我的值存储在表中以替换我当前的Map<String, List> ,如:

 create table CALCULATION_RESULTS_XXX ( deal_id varchar2, values number ); 

(每个计算一个表, XXX是计算ID)

所以在计算过程中,我会做以下事情:

  1. 计算开始时,我创建CALCULATION_RESULTS_XXX表。
  2. 每次我需要添加一个值时,我都会在此表中插入一条记录。
  3. 在计算结束时,我使用表格内容作为我的算法。
  4. 最后,我放弃了这张桌子。

正如在其他主题中所解释的那样,目前,我的计算可能会在内存中存储数百Mb的数据,因为30 * 1,000,000的Double列表需要大约240Mb。

现在问题:

  1. 如果我使用内存数据库,我的内存消耗是否会降低?
  2. 关于数据库使用(或表创建),数据插入等,我需要注意哪些具体要点?
  3. 我想我会选择H2数据库 。 您认为这是满足我需求的最佳选择吗?

问题非常简单,你真的需要试一试,看看(性能)结果是如何运作的。

您已经有一个只使用简单的内存结构的实现。 就个人而言,即使戴尔最便宜的电脑配备1GB + RAM,你也可以坚持下去。 除此之外,在一两个数据库中使用它应该相当简单。 我会考虑Sleepycat Berkerly DB(现在由Oracle拥有…),因为你不需要使用SQL,它们应该非常高效。 (他们确实支持Java)。

如果结果很有希望,那么我会考虑进一步调查,但这最多只需要几天时间,包括基准测试。

由Terracotta备份的简单HashMap会做得更好,并且允许存储比JVM虚拟内存更大的集合。

嵌入式数据库,尤其是基于SQL的嵌入式数据库,会增加代码的复杂性和开销,因此不值得。 如果您确实需要具有随机访问权限的持久存储,请尝试使用其中一个nosql数据库,如CouchDB , Cassandra , neo4j

我不知道它是否会更快,所以你必须尝试一下。 我想要推荐的是,当您不再需要该列表时,可以批量插入整个列表。 不要按价值保存价值:)

如果您的结束算法可以用SQL表示,那么也可能值得您这样做,而不是重新加载所有列表。在任何情况下,不要在值上放置任何类似索引或约束的内容,最好是也不允许NULL(如果可能)。 维护索引和约束花费时间,并且允许NULL也可能花费时间或创建开销。 deal_ids当然可以(并且因为它们是主键)被索引。

这不是很多,但至少比单一的低投票答案更好:)

根本没有理由添加外部组件来使程序运行得更慢。 如果需要处理的内存超过可用内存,请压缩数据块并将其写入文件。 一个工作站现在需要192GB的RAM,所以你不能浪费很多时间。