【问题标题】:Handle document processing that exceed memory limits with Elasticsearch使用 Elasticsearch 处理超出内存限制的文档处理
【发布时间】:2013-08-27 10:41:29
【问题描述】:

我使用 Tire 作为 Elasticsearch 的 Ruby 包装器。我的问题是我需要将 100,000 个文档加载到内存中并对它们进行复杂的计算。当前程序如下所示:

  1. 加载所有文档
  2. Computation.new(all_documents)
  3. 迭代所有文档并调用computation.calc(document)

此策略不适用于 100,000 个文档,因为我将立即达到机器的内存限制。文档 (JSON) 被加载到 Tire 对象中,然后我将其转换为 Ruby 哈希。

我可以做些什么来制作这个比例?我想到了以下,但我不确定a)是否最好实施b)最好的解决方案。

  1. 初始化计算对象c = Computation.new
  2. 加载 m 个文档
  3. c.preprocess(documents)
  4. 重复第 2 步和第 3 步,直到对所有文档进行预处理
  5. 加载 m 个文档
  6. 迭代 m 个文档
  7. c.calc(document)
  8. 重复第 6 步和第 7 步,直到处理完所有文档

同样从 GC 的角度来看,我不确定这会如何解决。

【问题讨论】:

  • 您需要所有个文档同时进行计算是否有特定原因?例如,您是否正在执行许多聚合计算?如果要对所有文档有效地运行相同的独立计算,那么您有很多可用的选项。例如,可以将 Elastic Search 设置为为您执行大量的每个字段或每个文档的处理。您能否详细说明计算类型?
  • @NeilSlater 不,我不需要同时使用它们,这就是我建议我提出的一种解决方案的原因。文档可以独立计算,但有些需要我在初始化过程中生成的一些共享数据。初始化过程分析所有文档并生成稍后用于计算的附加信息。我研究了可以直接在 JVM 中执行计算的 Elasticsearch 的脚本功能,但这并不反映我的情况。我使用许多不同的 gem,从网络上获取数据,比较基于本地库的值等等。

标签: ruby json garbage-collection elasticsearch tire


【解决方案1】:

您的问题似乎是“如何在不耗尽内存的情况下将 100,000 个 ElasticSearch JSON 对象序列化为 Ruby 对象?”。一个更好的问题是:“如何尽可能轻松高效地对 100,000 个 ElasticSearch 文档进行计算?”。由于我们不知道您要运行哪种计算,因此我们必须保持答案的一般性。

  1. 接受neil-slater 的建议,尽可能多地使用 ElasticSearch。例如,ES 在 DB/store 中有很多不错的 statistical calculations you can do
  2. 对插入新文档进行预处理。例如,如果您知道您将要针对整个集合获取计数、平均值或其他一些计算,则只需在将每个项目存储到 ES 之前计算每个项目的统计信息。如果您在 Rails 中使用 Tire,请将这些 calc 方法添加到 before_save 回调或其他内容中。
  3. 避免将 ES 文档一起反序列化为 Ruby 对象。将所有 100,000 个对象都转换为 Ruby 对象正在扼杀你的记忆。看看您是否可以通过将结果作为直接 JSON 获取并使用 ruby​​ JSON gem(或一些性能调整的替代方案,如 multi-json)将它们转换为 ruby​​ 哈希来提高性能。它仍然会保留一些内存,但几乎没有完整的 Rails 模型对象那么多。
  4. 尝试将计算分解为多个步骤,并将它们作为后台作业或后台任务提供给后台程序。如果它们需要按顺序执行,您可以让第一个作业在下一个作业完成时触发它。
  5. 如果上述方法都不起作用,请找到一种更接近数据的方法(直接使用一些 javascript lib 操作 JSON)或考虑使用其他数据存储,可能类似于 PostgreSQL,您可以在 DB 1000x 中进行大量计算比使用 Ruby/Rails 更快。

希望有帮助!

【讨论】:

  • 非常感谢您提供如此广泛的答案,尽管我的问题表述得如此广泛。它非常有帮助,我认为我现在做得很好。
猜你喜欢
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
相关资源
最近更新 更多