【发布时间】:2013-05-21 12:04:05
【问题描述】:
我正在尝试重新使用以下代码来创建一个 tar 球:
tarfile = File.open("#{Pathname.new(path).realpath.to_s}.tar","w")
Gem::Package::TarWriter.new(tarfile) do |tar|
Dir[File.join(path, "**/*")].each do |file|
mode = File.stat(file).mode
relative_file = file.sub /^#{Regexp::escape path}\/?/, ''
if File.directory?(file)
tar.mkdir relative_file, mode
else
tar.add_file relative_file, mode do |tf|
File.open(file, "rb") { |f| tf.write f.read }
end
end
end
end
tarfile.rewind
tarfile
只要涉及小文件夹,它就可以正常工作,但任何大文件夹都会失败并出现以下错误:
Error: Your application used more memory than the safety cap
如何分块执行以避免内存问题?
【问题讨论】:
-
是否有不能执行系统tar命令调用的原因?
-
是的,应用程序必须是可移植的。
-
您使用的是什么 ruby 环境?如果是 JRuby,可以通过 -J-Xmx 启动选项增加 JVM 可用的虚拟内存量;详细在这里:stackoverflow.com/questions/6910429/…
-
我知道我可以增加 JVM 内存,但我希望应用程序能够处理它。想象一下,如果我必须创建一个千兆字节的 tar。
标签: ruby-on-rails ruby