Выполнять большие скрипты с рельсами - PullRequest
4 голосов
/ 04 ноября 2011

Я сделал очень большой скрипт, чтобы почувствовать мои начальные данные в приложении rails. У меня есть около 3000 строк в моем CSV и 10000 изображений.

После загрузки возможно 300 я получил это сообщение:

/usr/local/lib/ruby/gems/1.9.1/gems/activesupport-3.0.9/lib/active_support/core_ext/kernel/agnostics.rb:7:in ``': Cannot allocate memory - identify -format %wx%h '/tmp/stream20111104-14788-1hsumv7.jpg[0]' (Errno::ENOMEM)

Мой скрипт загрузки:

if (row[28] != nil)
   hotelalbum = HotelAlbumPhoto.find_or_create_by_title(h.title)
   hotelalbum.description = "Album photo de l'hotel " + h.title.capitalize
   hotelalbum.hotel_id = h.id
   hotelalbum.save

   files =  Dir.glob('IMAGES/' + row[28].gsub(/\\/,'/') + '/*.jpg')
   i =0
   for file in files
      i += 1
      photopath = File.expand_path('../../import', __FILE__) + '/' + file
      photoname = file.split('/').last
      if (i==1)
        hotelalbum.thumbnail = open(photopath)
        hotelalbum.save
      end
      if (i==1)
        h.thumbnail = open(photopath)
      end
      photo = HotelImage.find_or_create_by_image_file_name_and_hotel_album_photo_id(photoname,hotelalbum.id)
      if (photo.image_file_size == nil || photo.image_file_name != photoname)
          photo.image = open(photopath)
          photo.activated = true
          photo.alt = "Photo de l'hotel " + h.title
          photo.save
      else
         puts photopath + ' already updated'
      end
   end
end

Когда я проверяю свою память командой top, я вижу, что процесс ruby ​​использует больше памяти при каждой загрузке. Как я могу справиться с этим?

Спасибо за помощь

ps. Мой сервер - это виртуальная машина с 512 МБ памяти, одним из решений является увеличение этой памяти, но я надеюсь найти другую.

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

Я не знаю, где определена функция открытия, но я подозреваю, что не вижу соответствующего закрытия ...

обновление Лучшая идея, изменить photo.image = open(photopath) на photo.image = File.read(photopath)

Согласно документам читать:

Opens the file, optionally seeks to the given offset, then 
returns length bytes (defaulting to the rest of the file). 
read ensures the file is closed before returning.
0 голосов
/ 16 ноября 2011

Похоже, проблема утечки памяти в ImageMagick?Может быть, это поможет обработать список большими блоками или кусками с in_groups_of и принудительно собрать мусор с GC.start после каждого куска:

files.in_groups_of(100) {|chunk| 
   # process chunk
   GC.start
}
...