2009-05-17 18 views
3

数週間前、Windows XP環境でいくつかのFTPコマンドをテストするための簡単なRubyスクリプトを書きました。すべてが予想どおりに機能していて、コードを実行するのに時間がかかっていないこともわかっていました(私は最大で3〜4秒でしょう)。Windows XPでRuby FTPが極端に遅い

数日前、私が開発しているアプリケーションは非常にゆっくりと動作し始めました。私が問題を調査したとき、私はFTPコマンドに問題を切り分けました。私は今元のテストスクリプトを再実行し、実行するにはを2回以上引き継ぎます。コマンドラインFTPは本質的に瞬間的です。

ruby​​ディレクトリ構造のファイルが変更されていません。私は、新しいアプリケーションがインストールされたとは思わない - 確かに他のアプリケーションは動作していないようだ。

誰でも次のコードが遅く実行される理由をお聞かせください。 printステートメントの間隔を手動で調整すると、nlstlsのそれぞれに約65秒かかることがわかります。プロファイラは、nlstの場合は16、lsの場合は31の合計16 ms/callと考えられます。

require 'net/ftp' 

Net::FTP.open("ip_redacted", "user_redacted", "password_redacted") do |ftp| 
    ftp.chdir("dir_redacted") 

    files = ftp.nlst 
    print "files = #{files.sort!}\n" 
    list = ftp.ls 
    print "list = #{list}\n" 

    file = "filename_redacted" 

    size = ftp.size(file) 
    print "size = #{size}\n" 

end 
+0

ルータの背後にいますか? –

+0

これは興味深い質問です。 2台のマシンはローカルネットワーク上にあります。一方から他方へのtracertは、そのネットワーク内で2つのホップを示します。 tracertは、すべてのホップが<1ミリ秒であることを示しますが、tracert自体には1分ほどの時間がかかります。コマンドラインFTPは、RubyからのFTPと同じ遅延を表示しないことに注意してください。 –

答えて

4

の周りに大きな遅れを占めます。このことができます

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/112910

希望。

+0

優秀!私はこれと数日間苦労してきました。私はこの回答を複数回アップヴォーグすることができたらいいと思う。 –

+0

リンクが動作していません – tommasop

+0

BasicSocket.do_not_reverse_lookup = true おかげでボブ・ヴェスターマン。 –

0

ディレクトリ内のファイルの束があります場合には、かなり高価なことができますので、(単にputs "files = #{files}"#sort!を削除してください。これは、Google検索から#nlst#ls

+0

ありがとうございますが、このケースではほとんど違いはありません。ディレクトリには約12のファイルしかありません。プロファイラによって、#sortには0.00ミリ秒かかります。私はデバッガのコードを踏んだり(またはむしろ次のステップに進んだ)、それは時間がかかっている#nlstと#lsです。 –

+0

ああ、まあ、推測の価値があった。 – rampion

2

私は同様の問題があり、パッシブモードでスピードが上がったことがわかりました。 ftp.passive=true

+0

ありがとうございます。 DNS逆引きルックアップを無効にすると私にとってはうまくいったが、他の人はパッシブモードを試すかもしれない。 –

関連する問題