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

标签 datomic

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

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

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

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

我知道这个配置可能是我的可用内存的函数,这很好。我也明白它可能无法发挥最大性能;那也没关系。但我确实需要知道它会终止。

最佳答案

数据分布

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

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

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

处理器内存

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

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

建议

尝试减少内存索引阈值内存索引最大设置。这可能看起来违反直觉,但您将有更好的机会完成任何导入(当然它们会花费更多时间,但您几乎可以保证它们会完成)。关键是让事务处理程序在无法跟上索引作业之前限制您的(对等)请求。

关于Datomic:强大的设置以避免超时和内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18302498/

相关文章:

clojure - 查找 ref-to-many 属性包含所有输入元素的实体

clojure - 如何使用枚举/引用的实体 id 执行 Datomic 事务?

clojure - 在 Datomic 中,如何获得对特定实体的值所做更改的时间线 View ?

clojure - 您可以使用 Datomic 快速将所有数据加载到内存中吗?

datomic - DataLog 等同于 SQL 吗?

clojure - 在 Datomic 中,在没有撤回的情况下查询字段历史记录?

clojure - n 元谓词 Datomic (n != 2) 可能吗?

join - Datomic - 没有引用的实体之间的连接

clojure - 对于此模式,在 Datomic 领域中更惯用的选项是什么?

datomic - 所有新的 datomic id 都比以前的大吗?