我在具有不同内存量(1GB - 16GB)的各种架构上运行相同的数据支持应用程序。当我批量导入数据时,我经常遇到超时或内存不足错误。
查看文档后,我偶然发现了这个 helpful document (和 this one )似乎概述了在大量导入下获得良好性能的最佳实践。
我对性能的兴趣不如对让导入“正常工作”感兴趣。这引出了我的主要问题:
确保任意大的导入进程在给定机器上终止的最低复杂度配置是多少?
我知道这个配置可能是我的可用内存的函数,这很好。我也明白它可能无法发挥最大性能;那也没关系。但我确实需要知道它会终止。
最佳答案
数据分布
我认为您的问题中缺少的关键信息是数据类型及其分布和 available metrics在批量导入期间为您的系统。为什么?
Datomic 的事务率受到后台索引作业成本的限制,而索引成本是新值的分布和数据库大小的函数。
这意味着,例如,如果您有索引属性(即 :db/index
),并且在批量导入过程中,这些属性值的分布为随机,您会给索引作业带来很大的压力,因为它会重写越来越多的段。随着数据库大小的增长,索引将主导事务处理程序的工作,并且无法跟上。
处理器内存
如文档中所述,您可以为 object-cache-max
提供的内存越多越好。如果您的数据有很多唯一性约束(即db/unique
),这一点尤其重要,因为这将阻止事务处理程序多次获取某些存储段。
根据您的数据分布,增加 memory-index-threshold
和 memory-index-max
设置可能会让您的导入运行时间更长...直到索引作业完成跟不上。这似乎就是发生在你身上的事情。
建议
尝试减少内存索引阈值
和内存索引最大
设置。这可能看起来违反直觉,但您将有更好的机会完成任何导入(当然它们会花费更多时间,但您几乎可以保证它们会完成)。关键是让事务处理程序在无法跟上索引作业之前限制您的(对等)请求。
关于Datomic:强大的设置以避免超时和内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18302498/