Ruby内存使用变得疯狂
从一个数据供应商那里,我使用RestClient在一个作业中下载了大约75张图像+40页的详细信息 是这样的:Ruby内存使用变得疯狂,ruby,memory-management,rest-client,Ruby,Memory Management,Rest Client,从一个数据供应商那里,我使用RestClient在一个作业中下载了大约75张图像+40页的详细信息 是这样的: 验证供应商服务并在变量中设置cookie jar 下载XML XML包含大约40个资产 对于每个资产,请下载图像列表。(每个资源的范围为0-10个图像) 下载图片 通过115个独特的请求,我的总下载量为148.14Mb,耗时37.58秒。我的内存消耗是: Total allocated: 1165532095 bytes (295682 objects) Total retained:
Total allocated: 1165532095 bytes (295682 objects)
Total retained: 43483 bytes (212 objects)
使用memory\u profiler
gem测量。下载约150mb数据的内存刚刚超过1gb
我最大的担忧是,我需要下载更多的数据——这只是15天数据中的1天。当我运行2天的数据时,我会将下载大小和内存大小增加一倍。当运行3天的数据时,我将其增加了三倍,等等。内存消耗似乎呈指数增长,直到内存耗尽,服务器崩溃
为什么垃圾收集不在这里?我尝试在每天下载的数据之间运行GC.start
,这会影响memory\u profiler
,但当我添加太多天的数据时,我的服务器仍然会崩溃
所以我的问题是:
谢谢我相信这都是关于您正在使用的http客户端:
Rest客户端
。不幸的是,它有一些坏名声,即内存不足。你绝对应该寻找一些既能节省内存又能节省时间的绝妙宝石
我强烈推荐或其http/2继承者
要想获得一个好的基准,请看另一个很棒的gem的作者写的这篇很棒的文章:
以下是我在本地计算机上用HTTP.rb替换Rest客户端后发现的内容:
版本:Ruby:2.5.3p105,HTTP.rb:4.0.0,OS:ubuntu16.04
总下载大小:96.92Mb通过118个唯一请求
内存消耗:
Total allocated: 7107283 bytes (83437 objects)
Total retained: 44221 bytes (385 objects)
因此,它在下载96.92Mb时只分配了7Mb,而使用Rest客户端时大约分配了1Gb
下面是代码片段:这是我的示例代码:当你说“一份工作”时,你指的是什么?耙任务?活动作业?实际上是一次运行。通常我会通过Rails的ActiveJob来执行,但我会在上面链接的独立文件中重现内存问题。如前所述,这是在检索15天中的1天数据时,每多解析一天,内存消耗就会呈指数增长。您尚未指定Ruby版本、主机操作系统或正在解析的资源。此外,您还没有提供完整的代码。(除非你将图像下载到内存中,然后在没有任何进一步处理的情况下丢弃它们)所以我唯一能给出的建议是:不要使用RestClient,它已经一年多没有更新了。使用更常用的东西,比如。我不认为我们已经证明RestClient是这里的问题,但我同意,版本和平台会有帮助。好的一个是如果bhai!不客气!很高兴传播这些令人敬畏的宝石:)