eX1stenZ
@eX1stenZ
Web Dev

Как освободить память в ходе работы Ruby скрипта?

Добрый день, в ходе изучения руби, столкнулся с проблемой что в ходе работы моего файла "test.rb" кушается много памяти, прожорливость растет, 30MB через 5 минут уже 40 - 50MB.

Пробывал вырезать все "print & puts" ну думал из за принта в консоль и сжирает = не помогло.
Пытался очищать все переменные перед запуском нового потока = не помогло
Пытался ограничивать кол-во потоков = не помогло (ждет пока завершится 10 потоков, стартует по мере завершения)

Кто может подсказать в чем может быть проблема? Возможно перед запуском нового потока в Ruby есть магическая функция "freeMemory()" о которой я не знаю :)

class TestParse
  attr_accessor :clientM
  attr_accessor :queries
  attr_accessor :threads

def initialize()
  @threads = []
  @clientM = client = Mysql2::Client.new(:host => "localhost", :username => "root", :password => '', :database => 'db')
end

def generateUrl()
  groupI = 0
  @queries = []
  while groupI <= 20 do
    prepareQuery()
    groupI = groupI+1;
  end
end

def prepareQuery
  @thread <<  .......HTTP QUERY.......
  hash = JSON.parse(resp.body)
  if (resp.code == "200")
    @queries << "INSERT INTO `posts` (`text`,`type`) VALUES ('#{@clientM.escape(a['text'])}',1);"
  end
end
end

s = TestParse.new()
isgl = 0
while isgl < 20
  s.generateUrl
  s.threads.each { |thr| thr.join }
  print "Query: "+s.queries.length.to_s+"\n"
  iQuery = 0
  s.queries.each { |q|
    s.clientM.query(q)
  }
  print "==================\n"
  s.queries = []
  isgl = isgl+1
end
  • Вопрос задан
  • 699 просмотров
Пригласить эксперта
Ответы на вопрос 2
sck_v
@sck_v
exflow.io
Руби сам по себе прожорливый по части памяти. А если использовать треды, то тем более.
Так что смириться.
Ответ написан
viktorvsk
@viktorvsk
прожорливость растет, 30MB через 5 минут уже 40 - 50MB.

А через 10 и 15 минут?
50 мегабайт для языков типа руби, питона и т.д. - это нормально

Память ОС такие языки не возвращают. Они помечают ее свободной, когда сборщик мусора до нее добирается, и такая память может быть занята новыми объектами.

В таких случаях прожорливые процессы принято убивать. Например, делать работу через юниксовский fork() и убивать его по завершении
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы