4

我在具有不同内存量(1GB - 16GB)的各种体系结构上运行相同的 datomic 支持的应用程序。当我批量导入数据时,我经常遇到超时或内存不足错误。

在查看了文档后,我偶然发现了这个有用的文档(和这个),它似乎概述了在大量导入下获得良好性能的最佳实践。

我对性能的兴趣不如使导入“正常工作”的兴趣。这导致了我的主要问题:

确保任意大的导入过程在给定机器上终止的最低复杂度配置是多少?

我知道这个配置可能是我可用内存的一个函数,这很好。我也明白它可能不是最高性能;这也很好。但我确实需要知道它会终止。

4

1 回答 1

3

数据分布

我认为您的问题中缺少的关键信息是数据类型及其分布以及批量导入期间系统的可用指标。为什么?

Datomic 的事务率受到后台索引作业成本的限制,并且该索引的成本是新值分布和数据库大小的函数。

这意味着,例如,如果您有索引属性 (ie :db/index),并且随着您的批量导入,这些属性值的分布是随机的,您将在索引作业重写时施加很大压力越来越多的细分市场。随着数据库大小的增长,索引将主导事务处理程序的工作,并且无法赶上。

事务处理内存

如文档中所述,您可以提供的内存object-cache-max越多越好。如果您的数据有很多唯一性约束(即db/unique),这一点尤其重要,因为这将阻止交易者多次获取某些存储段。

根据您的数据分布,增加memory-index-thresholdmemory-index-max设置可能会让您的导入运行更长时间......直到索引作业跟不上。这似乎就是发生在你身上的事情。

建议

尝试减少memory-index-thresholdmemory-index-max设置。这可能看起来违反直觉,但您将有更好的机会完成任何导入(当然它们会花费更多时间,但您几乎可以保证它们会完成)。关键是让交易者在无法赶上索引作业之前限制您的(对等)请求。

于 2013-08-18T20:23:20.247 回答