Ruby / Mechanize以任何方式排空RAM? - >无法分配内存

时间:2011-08-23 14:47:41

标签: ruby variables memory mechanize ram

我已经建立了一个在网站上投票给我的代码......

Ruby脚本工作得很好,但经过几分钟后,这个脚本停止了这个错误:link of the screen-shot

所以我检查了windows任务管理器,并且在每次循环后内存分配给ruby.exe增长!

这是代码的罪魁祸首:

class VoteWebsite
        def self.main
        agent = Mechanize.new
        agent.user_agent_alias = 'Windows Mozilla'
    while $stop!=true
        page = agent.get 'http://website.com/vote.php'
        reports_divs = page.search(".//div[@class='Pad1Color2']")
        tds = reports_divs.search("td")
        i = 3;j = 0;ouiboucle=0;voteboucle=0
        while i < tds.length
            result = tds[i].to_s.scan(/<font class="ColorRed"><b>(.*?) :<\/b><\/font>/)
            type = result[0].to_s[2..-3]
            k=i
            case type
            when "Type of vote"
                j= i+1;i += 4
                result2 = tds[j].to_s.scan(/<div id="btn(.*?)">/)           
                id = result2[0].to_s[2..-3]
                monvote=define_vote($vote_type, tds[k].to_s, $vote_auto)
                page2 = agent.get 'http://website.com/AJAX_Vote.php?id='+id+'&vote='+monvote
                voteboucle+=1
                .
                .
                .
            else
                .
                .
                .
            end
        end     
    end
    end
end
VoteWebsite.main

我认为将方法中的所有变量声明为全局变量应该解决这个问题,但是代码非常大,并且在这个方法中有很多变量。

那么有没有办法(任何Ruby指令)在每个循环结束时排空所有这个变量?

2 个答案:

答案 0 :(得分:2)

事实上,问题出现在机械化see this answerMechanize::History.clear方法的历史记录中,甚至只是将Mechanize::History.max_size属性设置为合理的值。

#!/usr/bin/env ruby

require 'mechanize'

class GetContent
    def initialize url
        agent = Mechanize.new
    agent.user_agent_alias = 'Windows Mozilla'
    agent.history.max_size=0
    while true
            page = agent.get url
        end
    end
end

myPage = GetContent.new('http://www.nypost.com/')
希望它有所帮助!

答案 1 :(得分:1)

您可以随时强制垃圾收集器启动:

GC.start

作为一个说明,这看起来不是很Ruby。使用;将多个语句打包到一行是不好的形式,使用$类型变量可能是从其他地方移植的遗留物。

请记住,$ - 前缀变量是Ruby中的全局变量,如果不慎使用会导致大量问题,应该在特定情况下保留。最好的选择是@ - 前缀实例变量,或者如果必须,则声明CONSTANT