我需要在 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
要并行下载文件,您可以使用具有超时的多个线程:
完成并行工作的一个好方法是赛璐珞,并发框架:
https://github.com/celluoid/赛璐珞
话虽如此,如果下载速度仅限于您的整体网络带宽,那么这些方法都无济于事。
在这种情况下,为了加快传输速度,请确保您只下载已更改的信息:新文件和现有文件的更改部分。
分段下载在某些情况下可以提供巨大的加速,例如下载的大日志文件只有一小部分文件发生了变化,并且这些变化都在文件的末尾,并且都是附加的。
您还可以考虑使用命令行。有许多工具可以帮助您解决这个问题。一个很好的通用方法是“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 的包装器,可以并行进行多个连接。
这是其中一个示例的修改版本:
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 源代码(它们非常大,因此需要大约一分钟,具体取决于您的 Internet 连接和主机)。在最后一个块被写出之前,您不会看到任何文件出现。