Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby内存使用变得疯狂_Ruby_Memory Management_Rest Client - Fatal编程技术网

Ruby内存使用变得疯狂

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:

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

是这样的:

  • 验证供应商服务并在变量中设置cookie jar
  • 下载XML
  • XML包含大约40个资产
  • 对于每个资产,请下载图像列表。(每个资源的范围为0-10个图像)
  • 下载图片
  • 通过115个独特的请求,我的总下载量为148.14Mb,耗时37.58秒。我的内存消耗是:

    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
    ,但当我添加太多天的数据时,我的服务器仍然会崩溃

    所以我的问题是:

  • 为什么与我实际下载的数据相比,内存消耗如此之高
  • 当我在每次下载之间覆盖保存下载数据的变量时,垃圾收集是否应该清除前一次数据下载的内存
  • 有什么技巧可以降低内存消耗吗
  • 版本:Ruby:2.4.4p296,RestClient:2.0.2,OS:Ubuntu 16.04

    示例代码:

    使用RestClient:

    使用HTTParty:


    谢谢

    我相信这都是关于您正在使用的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!不客气!很高兴传播这些令人敬畏的宝石:)