Datomic:强大的设置,可避免超时和内存不足错误



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

在查看了这些文档后,我偶然发现了这个有用的文档(以及这个文档),它似乎概述了在大量进口的情况下获得良好性能的最佳实践。

我对性能的兴趣不如让进口产品"发挥作用"。这引出了我的主要问题:

确保任意大型导入过程在给定机器上终止的最低复杂性配置是什么

我知道这个配置可能是我可用内存的函数,没关系。我也明白,它可能不是最大限度的表演;这也没关系。但我确实需要知道它会终止。

数据分布

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

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

这意味着,例如,如果您有索引属性(即:db/index),并且在批量导入过程中,这些属性值的分布是随机的,那么在重写不断增加的段时,您将给索引作业带来很大压力。随着数据库规模的增长,索引将主导事务处理程序的工作,无法跟上。

变速器存储器

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

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

建议

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

最新更新