【发布时间】:2018-12-02 04:42:59
【问题描述】:
我从一个数据供应商那里下载了大约 75 张图片和 40 页的详细信息,在一项工作中使用 RestClient。
是这样的:
- 向供应商服务验证并在变量中设置 cookie jar
- 下载 XML
- XML 包含大约 40 个资产。
- 对于每个资产的图像下载列表。 (每个资产包含 0-10 张图片)。
- 下载图片。
通过 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,但是当我添加太多天的数据时,我的服务器仍然会崩溃。
所以我的问题是:
- 与我实际下载的数据相比,为什么内存消耗如此之高。
- 当我在每次下载之间覆盖保存下载数据的变量时,垃圾收集是否应该不清除之前数据下载的内存?
- 有什么技巧可以降低内存消耗?
版本: 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