Ruby内存使用率疯狂

时间:2018-11-06 10:10:19

标签: ruby memory-management rest-client

我从数据供应商处使用RestClient下载约75张图像+ 40页详细信息。

是这样的:

  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宝石测量。要下载约150mb的数据,刚好超过1gb的内存?

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

为什么垃圾回收不在这里启动?我尝试在每天下载的数据之间运行GC.start,这很有趣memory_profiler,但是当我添加过多的数据时,服务器仍然会崩溃。

所以我的问题是:

  1. 为什么与我实际下载的数据相比,内存消耗如此之高?
  2. 当我覆盖每次下载之间保存已下载数据的变量时,垃圾收集是否应该然后清除先前数据下载的内存?
  3. 有什么技巧和窍门来减少内存消耗吗?

版本::Ruby: 2.4.4p296 ,RestClient: 2.0.2 ,操作系统: Ubuntu 16.04 < / p>

示例代码:

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

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

谢谢

1 个答案:

答案 0 :(得分:2)

我认为这全都与您使用的http客户端有关:Rest-Client。不幸的是,它因渴望记忆而享有一定的声誉。您绝对应该寻找同时具有内存/时间效率功能的超棒宝石。

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

要获得良好的基准,请查看另一篇很棒的宝石Shrinehttps://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。

以下是代码段:https://gist.github.com/mtrolle/96f55822122ecabd3cc46190a6dc18a5#gistcomment-2774405