2

ruby Net-sftp gem を使用しています。ダウンロードする前に、多数の小さなファイルをダウンロードする必要があります。指定されたディレクトリ内のファイルのリストを取得する必要があります。
それを行うためにsftp.dir.entries('folder path').size、ファイル数のリストを取得するために使用していますが、10,000 個を超えるファイルに対してこの操作を実行すると、時間がかかりすぎます (数時間もかかります)。これを行うためのより良い方法はありますか?
これを使ってみてssh.exec!("ls -l")も遅いです。
Windowsサーバー2008 R2であるWindowsボックスに接続しようとしています

4

1 に答える 1

4

検証を含む一連のファイルをダウンロードするには、次のようにします。

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

このアプローチを使用する際に覚えておくべきことの 1 つは、SFTP サーバー プロトコルに違いがあり、アクセス可能な属性の数に影響することですremote_filesftp.protocol接続を開いた後に呼び出すことで、使用しているプロトコルを確認できます。

.glob("/path/to/folder", "*.ext")または、クエリの一部として検証を SFTP に渡したい場合は、検証がファイル拡張子に基づいているかどうかの代わりに試すことができますが.entries、速度的にどのように機能するかについては言えません (ドキュメントここで)。理論的には、クエリを高速化できます (返されるデータが少なくなります) が、前もってより多くの作業が必要になるため、それが役立つかどうかはわかりません。

専用の 2 GB の RAM (ホストは Windows 7) を搭載した Ubuntu 12 を実行する VirtualBox からスクリプトを実行し、Windows Server 2008 R2 SP1 がインストールされたサーバーに接続し、SFTP 部分に SolarWind を実行しています。Ruby 1.9.3p392、Net-SFTP 2.1.2、および Net-SSH 2.6.8。これらの技術仕様では、1 分間におよそ平均 78 ファイルです (ただし、これは検証なしです)。

于 2013-10-28T21:18:18.040 に答える