2012-11-10 34 views
2

我需要在ruby本地緩存一個ftp文件夾。現在我正在使用ftp_sync下載ftp文件夾,但它很痛苦,你們知道任何可以並行下載文件夾文件的庫嗎? 謝謝!如何在Ruby中並行遞歸下載FTP文件夾?

+0

爲什麼必須在Ruby中完成?有很好的工具可以完成它,比如rsync,你可以從Ruby中調用。 –

回答

1

的syncftp寶石可以幫助你:

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 Timeout Threads

得到並行工作做的好方法是賽璐璐,併發框架:

https://github.com/celluloid/celluloid

所有這一切說,如果下載速度被限制在整體網絡帶寬,那麼這些方法都沒有將幫助很大。

爲了加快這種情況下的傳輸速度,請確保您只下載已更改的信息:新文件和已更改的現有文件部分。

分段下載可以給在某些情況下大規模的加速,如下載大的日誌文件,只有文件的一小部分發生了變化,變化都在文件的末尾,都追加。

你也可以考慮炮擊到命令行。有很多工具可以幫助你做到這一點。一個好的通用的一個是「捲曲」時,支持簡單的範圍爲FTP文件以及,比如你可以得到的第一個100個字節使用FTP這樣的文件:

curl -r 0-99 ftp://www.get.this/README 

你開放給其他FTP以外的協議?看看「rsync」命令,它非常適合下載同步。 rsync命令有很多優化來傳輸更改後的數據。例如rsync的可以同步遠程目錄到本地目錄是這樣的:

rsync -auvC [email protected]:/remote/foo/ /local/foo/ 
+0

我最終不需要實現並行ftp下載,但是從ruby裏面使用rsync或者其他工具會很好。 –

1

Curb看看。它是Curl的包裝,可以並行進行多個連接。

這是one of their examples修改後的版本:

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源(這是相當大的,因此他們將需要大約一分鐘,這取決於你的互聯網連接和主辦)。直到最後一個塊出現時,纔會看到任何文件出現。