Ruby GPGME – 如何加密大文件
我在使用Ruby中的GPGME加密大文件(大于可用内存)时遇到了困难。
#!/usr/bin/ruby require 'gpgme' def gpgfile(localfile) crypto = GPGME::Crypto.new filebasename = File.basename(localfile) filecripted = crypto.encrypt File.read(localfile), :recipients => "info@address.com", :always_trust => true File.open("#{localfile}.gpg", 'w') { |file| file.write(filecripted) } end gpgpfile("/home/largefile.data")
在这种情况下,我得到了内存分配错误: “读取:无法分配内存(NoMemoryError)”
有人可以解释我如何按块(例如100Mb)读取源文件块并通过加密写入它们吗?
最明显的问题是您使用File.read(localfile)
将整个文件读入内存。 Crypto#encrypt
File.read(localfile)
方法将IO对象作为其输入,因此您可以将File对象传递给File.read(localfile)
(它将文件的内容作为字符串返回File.read(localfile)
,而不是File.read(localfile)
。 同样,您可以将IO对象作为:output
选项,让您将输出直接写入文件而不是内存:
def gpgfile(localfile) infile = File.open(localfile, 'r') outfile = File.open("#{localfile}.gpg", 'w') crypto = GPGME::Crypto.new crypto.encrypt(infile, recipients: "info@address.com", output: outfile, always_trust: true) ensure infile.close outfile.close end
我从来没有使用过ruby-gpgme,所以我不是100%肯定这会解决你的问题,因为它取决于ruby-gpgme在幕后做了什么,但是从文档和来源我偷看了它看起来像是一个精心打造的gem,所以我猜这会成功。