1

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

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

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

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

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 数据库。您认为这是满足我需求的最佳选择吗?
4

4 回答 4

2

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

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

于 2010-10-14T17:59:28.540 回答
0

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

如果您的最终算法可以用 SQL 表示,那么这样做可能也值得您花时间去做,而不是重新加载所有列表。无论如何,不​​要在值上放置任何索引或约束之类的东西,最好也不允许 NULL(如果可能)。维护索引和约束会耗费时间,而允许 NULL 也会耗费时间或产生开销。deal_ids 当然可以(并且是)索引,因为它们是主键。

这不是很多,但至少比一个被否决的答案更好:)

于 2010-10-14T18:35:52.693 回答
0

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

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

如果结果很有希望,我会考虑进一步调查,但这真的应该只需要几天的工作,最多,包括基准测试。

于 2010-10-17T22:34:26.587 回答
0

There really is no reason at all to add an external component to make your program run slower. Compress the data block and write it to file if you need to handle more than the internal memory available. A workstation now takes 192GB of ram so you can't afford to waste much time on it.

于 2011-08-28T15:58:47.707 回答