我做了一个非常大的脚本,感觉我的初始数据进入我的rails应用程序。我的CSV和10000张图片中有大约3000行。
在上传之后我收到了这条消息:
/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:我的服务器是一个512Mb内存的虚拟机,一个解决方案就是增加内存,但我希望找到另一个。
答案 0 :(得分:1)
我不知道open函数的定义在哪里,但我怀疑我没有看到相应的关闭......
更新更好的主意,将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.
答案 1 :(得分:0)
看起来像ImageMagick的内存泄漏问题?也许它有助于使用in_groups_of
处理大块或块的列表,并在每个块之后强制使用GC.start
进行垃圾收集:
files.in_groups_of(100) {|chunk|
# process chunk
GC.start
}