【问题标题】:ruby net sftp : fastest way to get list of filesruby net sftp:获取文件列表的最快方法
【发布时间】:2013-10-31 22:56:49
【问题描述】:

我正在使用 ruby​​ Net-sftp gem,我需要在下载之前下载大量小文件,我需要确保获取给定目录中的文件列表。
为了做到这一点,我使用sftp.dir.entries('folder path').size 来获取文件计数列表,但是对超过 10,000 个文件执行此操作需要花费太多时间(甚至数小时)有没有更好的方法来做到这一点?
即使我尝试使用ssh.exec!("ls -l"),这也很慢。
我正在尝试连接到 windows server 2008 R2 的 windows box

【问题讨论】:

    标签: ruby net-ssh net-sftp


    【解决方案1】:

    要下载一系列带有验证的文件,我会执行以下操作:

    Net::SFTP.start(ftp_host, user, :password => password) do |sftp|
      sftp.dir.entries('/path/to/folder').each do |remote_file|
        if passes_validation?(remote_file)
          file_data = sftp.download!('/path/to/folder' + '/' + remote_file.name)
          local_file = File.open('/path/to/local', 'wb')
          local_file.print file_data
          local_file.close
        end
      end
    end
    

    使用这种方法时要记住的一点是,SFTP 服务器协议存在差异,这会影响remote_file 可以访问的属性数量;您可以在打开连接后调用sftp.protocol 检查您正在使用的协议。

    或者,如果您想尝试将验证作为查询的一部分传递给 SFTP,如果您的验证基于文件扩展名,您可以尝试 .glob("/path/to/folder", "*.ext") 而不是 .entries,但我不能代表它将如何在速度方面工作(文档here)。理论上,它可以加快查询速度(返回更少的数据),但由于它涉及更多的前期工作,我不确定它是否会有所帮助。

    我正在从运行 Ubuntu 12 的 VirtualBox 运行我的脚本,专用 2 GB RAM(主机是 Windows 7),并连接到安装了 Windows Server 2008 R2 SP1 的服务器,为 SFTP 部分运行 SolarWind; Ruby 1.9.3p392、Net-SFTP 2.1.2 和 Net-SSH 2.6.8。根据这些技术规格,我平均每分钟大约 78 个文件(尽管这没有经过验证)。

    【讨论】:

    • "i need to make sure i get a list of files in the given directory" - can you explain why you need this? 我需要在下载前运行一些验证
    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多