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