我已经建立了一个在网站上投票给我的代码......
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指令)在每个循环结束时排空所有这个变量?
答案 0 :(得分:2)
事实上,问题出现在机械化see this answer或Mechanize::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
。