【发布时间】:2013-08-27 10:41:29
【问题描述】:
我使用 Tire 作为 Elasticsearch 的 Ruby 包装器。我的问题是我需要将 100,000 个文档加载到内存中并对它们进行复杂的计算。当前程序如下所示:
- 加载所有文档
Computation.new(all_documents)- 迭代所有文档并调用
computation.calc(document)
此策略不适用于 100,000 个文档,因为我将立即达到机器的内存限制。文档 (JSON) 被加载到 Tire 对象中,然后我将其转换为 Ruby 哈希。
我可以做些什么来制作这个比例?我想到了以下,但我不确定a)是否最好实施b)最好的解决方案。
- 初始化计算对象
c = Computation.new- 加载 m 个文档
c.preprocess(documents)- 重复第 2 步和第 3 步,直到对所有文档进行预处理
- 加载 m 个文档
- 迭代 m 个文档
c.calc(document)- 重复第 6 步和第 7 步,直到处理完所有文档
同样从 GC 的角度来看,我不确定这会如何解决。
【问题讨论】:
-
您需要所有个文档同时进行计算是否有特定原因?例如,您是否正在执行许多聚合计算?如果要对所有文档有效地运行相同的独立计算,那么您有很多可用的选项。例如,可以将 Elastic Search 设置为为您执行大量的每个字段或每个文档的处理。您能否详细说明计算类型?
-
@NeilSlater 不,我不需要同时使用它们,这就是我建议我提出的一种解决方案的原因。文档可以独立计算,但有些需要我在初始化过程中生成的一些共享数据。初始化过程分析所有文档并生成稍后用于计算的附加信息。我研究了可以直接在 JVM 中执行计算的 Elasticsearch 的脚本功能,但这并不反映我的情况。我使用许多不同的 gem,从网络上获取数据,比较基于本地库的值等等。
标签: ruby json garbage-collection elasticsearch tire