【问题标题】:Ruby Memory Usage gone wildRuby 内存使用变得疯狂
【发布时间】:2018-12-02 04:42:59
【问题描述】:

我从一个数据供应商那里下载了大约 75 张图片和 40 页的详细信息,在一项工作中使用 RestClient。

是这样的:

  1. 向供应商服务验证并在变量中设置 cookie jar
  2. 下载 XML
  3. XML 包含大约 40 个资产。
  4. 对于每个资产的图像下载列表。 (每个资产包含 0-10 张图片)。
  5. 下载图片。

通过 115 个唯一请求,我在 37.58 秒内的总下载大小为 148.14Mb。我的内存消耗是:

Total allocated: 1165532095 bytes (295682 objects)
Total retained:  43483 bytes (212 objects)

memory_profiler gem 测量。下载大约 150mb 的数据需要 1gb 以上的内存?

我最担心的是,我需要下载更多数据 - 这只是 15 天数据中的 1 天。当我运行 2 天的数据时,我将下载大小和内存大小加倍。当运行 3 天的数据时,我的数据增加了两倍等。它甚至看起来内存消耗呈指数级增长,直到我用完内存并且我的服务器崩溃。

为什么垃圾收集在这里没有发挥作用?我尝试在每天下载的数据之间运行GC.start,这欺骗了memory_profiler,但是当我添加太多天的数据时,我的服务器仍然会崩溃。

所以我的问题是:

  1. 与我实际下载的数据相比,为什么内存消耗如此之高。
  2. 当我在每次下载之间覆盖保存下载数据的变量时,垃圾收集是否应该不清除之前数据下载的内存?
  3. 有什么技巧可以降低内存消耗?

版本: Ruby:2.4.4p296,RestClient:2.0.2,操作系统:Ubuntu 16.04

示例代码:

使用 RestClient:https://gist.github.com/mtrolle/96f55822122ecabd3cc46190a6dc18a5

使用 HTTParty:https://gist.github.com/mtrolle/dbd2cdf70f77a83b4178971aa79b6292

谢谢

【问题讨论】:

  • 当你说“一份工作”时,你指的是什么?耙任务?在职?
  • 实际上是一次运行。通常我会通过 Rails 的 ActiveJob 执行此操作,但我在上面链接的独立文件中重现了内存问题。如前所述,这是在检索 15 天中只有 1 天的数据时,我解析的每一天的内存消耗都会呈指数增长。
  • 您尚未指定 Ruby 版本、主机操作系统或正在解析的资源。此外,您还没有提供完整的代码。 (除非您将图像下载到内存中,然后在没有任何进一步处理的情况下丢弃它们)所以我能给出的唯一建议是:不要使用一年多没有更新的 RestClient。使用更常用的东西,例如httparty
  • 我不认为我们已经证明 RestClient 是这里的问题,但我同意,版本和平台会有所帮助。

标签: ruby memory-management rest-client


【解决方案1】:

我相信这与您使用的 http 客户端有关:Rest-Client。不幸的是,它有一些内存饥渴的坏名声。您绝对应该寻找一些既内存/时间效率高的很棒的宝石。

我强烈推荐 HTTP.rb 或其 http/2 继任者 HTTPX

要获得良好的基准,请查看另一篇很棒的 gem Shrine: https://twin.github.io/httprb-is-great/ 的作者的这篇很棒的文章

这是我在本地机器上用 HTTP.rb 替换 Rest-Client 后发现的:

版本:Ruby:2.5.3p105,HTTP.rb:4.0.0,操作系统:Ubuntu 16.04

总下载大小:96.92Mb 通过 118 个唯一请求。

内存消耗:

Total allocated: 7107283 bytes (83437 objects)
Total retained:  44221 bytes (385 objects)

因此它在下载 96.92Mb 时仅分配了 7Mb,而使用 Rest-Client 大约为 1Gb。

这里是sn-p:https://gist.github.com/mtrolle/96f55822122ecabd3cc46190a6dc18a5#gistcomment-2774405

【讨论】:

  • 好一个 Wasif bhai!
  • 不客气!很高兴传播这些令人敬畏的宝石:)
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2015-03-25
相关资源
最近更新 更多