【发布时间】:2014-09-18 21:40:20
【问题描述】:
我编写了一个脚本,通过我的 Rackspace 云文件容器递归下载并检索每个文件的副本,因此我有一个本地备份,以防 Rackspace 被流星和/或hindenbugs 击中。
但是,我的脚本在下载文件时显然会以线性比例泄漏内存。
基本上我有一个看起来像这样的方法:
def download_file(fog_file, destination_path)
data = fog_file.body
File.open(destination_path, 'w') { |f| f.write(data) }
end
我了解由于 Fog 的性质,我无法避免将整个文件加载到内存中,但我想 Ruby 会在每次 download_file 调用后释放内存(或有能力释放内存)。毕竟,data 变量超出了范围。
不幸的是,当我查看我的系统监控时,内存使用量一直以线性速度增加,直到它消耗了我所有的可用内存,此时脚本崩溃。
我在这里做错了什么?
我在 Ubuntu 上使用 Ruby 2.1.2。
【问题讨论】:
-
不确定为什么要泄漏(您是否保留了雾文件的引用?)但您可以流式下载雾文件(例如,请参阅kylev.com/2013/05/14/foggy-sponges-and-kittens)
-
Ruby 在关于 File.open 的 do/end 块之后内置了垃圾收集。尝试显式关闭文件,看看是否有帮助。