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 超时线程

完成并行工作的一个好方法是赛璐珞,并发框架:

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/ 
于 2012-11-10T04:44:43.890 回答
1

看看路边。它是 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 连接和主机)。在最后一个块被写出之前,您不会看到任何文件出现。

于 2012-11-10T04:52:02.737 回答