3

ruby で ftp フォルダーをローカルにキャッシュする必要があります。現在、 ftp_syncを使用してftpフォルダーをダウンロードしていますが、非常に遅いです.フォルダーファイルを並行してダウンロードできるライブラリを知っていますか? ありがとう!

4

2 に答える 2

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

ファイルを並行してダウンロードするには、タイムアウト付きの複数のスレッドを使用できます。

Ruby Net::FTP タイムアウト スレッド

並行作業を行う優れた方法は、並行フレームワークである 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/ 
于 2012-11-10T04:44:43.890 に答える
1

縁石を見てください。これは 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 分かかります)。ファイルが書き出される最後のブロックまで、ファイルは表示されません。

于 2012-11-10T04:52:02.737 に答える