ruby で ftp フォルダーをローカルにキャッシュする必要があります。現在、 ftp_syncを使用してftpフォルダーをダウンロードしていますが、非常に遅いです.フォルダーファイルを並行してダウンロードできるライブラリを知っていますか? ありがとう!
2 に答える
syncftp gem は次のことに役立ちます。
http://rubydoc.info/gems/syncftp/0.0.3/frames
Ruby には、独自の FTP ライブラリが組み込まれています。
http://www.ruby-doc.org/stdlib-1.9.3/libdoc/net/ftp/rdoc/Net/FTP.html
ファイルを並行してダウンロードするには、タイムアウト付きの複数のスレッドを使用できます。
並行作業を行う優れた方法は、並行フレームワークである Celluloid です。
https://github.com/celluloid/celluloid
とはいえ、ダウンロード速度がネットワーク帯域幅全体に制限されている場合、これらのアプローチはどれもあまり役に立ちません.
この場合に転送を高速化するには、変更された情報 (新しいファイルと既存のファイルの変更されたセクション) のみをダウンロードしていることを確認してください。
セグメント化されたダウンロードは、ファイルのごく一部しか変更されていない大きなログ ファイルをダウンロードし、変更がすべてファイルの最後にあり、すべてが追加されている場合など、場合によっては大幅な速度向上を実現できます。
コマンドラインへのシェルアウトを検討することもできます。これに役立つツールはたくさんあります。優れた汎用的なものは "curl" で、FTP ファイルの単純な範囲もサポートします。たとえば、次のように FTP を使用してドキュメントの最初の 100 バイトを取得できます。
curl -r 0-99 ftp://www.get.this/README
FTP 以外のプロトコルを使用できますか? ダウンロード同期に優れた「rsync」コマンドを見てみましょう。rsync コマンドには、変更されたデータのみを転送するための多くの最適化があります。たとえば、rsync は次のようにリモート ディレクトリをローカル ディレクトリに同期できます。
rsync -auvC me@my.com:/remote/foo/ /local/foo/
縁石を見てください。これは Curl のラッパーであり、複数の接続を並行して行うことができます。
これは、その例の 1 つの修正版です。
require 'curb'
urls = %w[
http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p286.tar.bz2
http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2
]
responses = {}
m = Curl::Multi.new
# add a few easy handles
urls.each do |url|
responses[url] = Curl::Easy.new(url)
puts "Queuing #{ url }..."
m.add(responses[url])
end
spinner_counter = 0
spinner = %w[ | / - \ ]
m.perform do
print 'Performing downloads ', spinner[spinner_counter], "\r"
spinner_counter = (spinner_counter + 1) % spinner.size
end
puts
urls.each do |url|
print "[#{ url } #{ responses[url].total_time } seconds] Saving #{ responses[url].body_str.size } bytes..."
File.open(File.basename(url), 'wb') { |fo| fo.write(responses[url].body_str) }
puts 'done.'
end
これにより、Ruby と Python の両方のソースが取り込まれます (かなり大きいので、インターネット接続とホストによっては、約 1 分かかります)。ファイルが書き出される最後のブロックまで、ファイルは表示されません。