1

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)読み取り、暗号化を介してそれらを書き込む方法を説明できますか?

4

1 に答える 1

1

最も明らかな問題は、ファイル全体を .xml でメモリに読み込んでいることですFile.read(localfile)。このCrypto#encryptメソッドは入力として IO オブジェクトを受け取るので、File.read(localfile)(ファイルの内容を文字列として返す) の代わりに、File オブジェクトを渡すことができます。同様に、:outputオプションとして IO オブジェクトを指定すると、出力をメモリではなくファイルに直接書き込むことができます。

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 が舞台裏で何をするかに少し依存するからですが、ドキュメントと私が覗いたソースから健全に構築された宝石のように見えるので、これでうまくいくと思います。

于 2016-01-21T18:10:05.573 に答える