Ruby / Mechanize Есть ли способ слить оперативную память?-> не удалось выделить память - PullRequest
2 голосов
/ 23 августа 2011

Я создал код, который голосует за меня на сайте ...

Скрипт Ruby работает довольно хорошо, но через несколько минут этот скрипт останавливается с такими ошибками: ссылка на скриншот

Итак, я проверил диспетчер задач 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 ]

2 голосов
/ 20 сентября 2011

Проблема возникла, на самом деле, из истории механизации см. Этот ответ или 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 голос
/ 23 августа 2011

Вы всегда можете принудительно включить сборщик мусора:

GC.start

Как примечание, это выглядит не очень Ruby.Упаковка нескольких операторов в одну строку с использованием ; является плохой формой, а использование переменных типа $, вероятно, является следствием переноса его из чего-то другого.

Помните, что $ -приставленные переменные глобальные переменные в Ruby и могут вызвать массу проблем, если используются небрежно и должны быть зарезервированы для очень специфических обстоятельств.Лучшей альтернативой является переменная экземпляра с префиксом @ или, если необходимо, объявленная CONSTANT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...