我的应用程序目前存储了数百万个 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数据库. 。您认为这是满足我需求的最佳选择吗?
有帮助吗?

解决方案

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

您已经有了仅使用简单内存结构的实现。就个人而言,鉴于戴尔(Dell)最便宜的计算机带有1GB+ RAM,您也可以坚持使用。除此之外,在一个或两个数据库中填写应该非常简单。我会考虑SleepyCat Berkerly DB(现在由Oracle拥有...),因为您不需要使用SQL,它们应该非常有效。 (他们确实支持Java)。

如果结果是有希望的,我将考虑进一步调查,但这实际上只需要花几天的时间工作,包括基准测试。

其他提示

一个简单的哈希图支持 红陶 会做得更好,并且将允许将比JVM虚拟内存更大的集合存储。

嵌入式数据库,尤其是基于SQL的数据库将为您的代码增加复杂性和开销,因此不值得。如果您确实需要随机访问的持续存储,请尝试使用NOSQL DB中的一个,例如 couchdb, 卡桑德拉, neo4j

不知道会不会更快,所以你必须尝试一下。我确实想建议的是,当您不再立即需要该列表时,批量插入整个列表。不要按值保存值:)

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

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

确实没有理由添加外部组件以使您的程序运行较慢。压缩数据块并将其写入文件,如果您需要处理比可用的内部内存更多的操作。现在,一个工作站需要192GB的RAM,因此您无法浪费很多时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top