Windows XP下Ruby的FTP非常缓慢

3

几周前,我编写了一个简单的Ruby脚本,在Windows XP环境中测试了一些FTP命令。一切都如预期那样工作,我甚至没有意识到代码运行所需的时间(我猜最多为3-4秒)。

几天前,我正在开发的一个更复杂的Ruby应用程序开始运行得非常慢。在调查问题时,我将问题隔离到了FTP命令上。现在我重新运行了原始的测试脚本,需要超过两分钟的时间才能运行。命令行FTP基本上是即时的。

ruby目录结构中没有更改任何文件。我认为没有安装任何新应用程序-当然没有其他应用程序在运行。

有人能建议为什么以下代码应该运行得非常慢吗?手动计时print语句之间的间隔表明nlstls每个需要约65秒!分析器给出了nlst总毫秒/调用16,ls总毫秒/调用31,更可信。

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

你在路由器后面吗? - John T
这是一个有趣的问题。这两台机器在一个本地网络上。从一台机器到另一台机器的 tracert 显示该网络中有两个跳点。tracert 指示所有跳点都小于 1 毫秒,但是 tracert 自身需要花费一分钟返回结果。请注意,命令行 FTP 和 Ruby 的 FTP 不显示相同的延迟。 - Dave McLaughlin
3个回答

4

太棒了!我已经为此苦苦挣扎了好几天。我希望我能多次点赞这个答案。 - Dave McLaughlin
BasicSocket.do_not_reverse_lookup = true祝好,Bob Vesterman。 - Lee Irving

2

我遇到了类似的问题,发现被动模式可以提高速度,例如:ftp.passive=true


禁用反向DNS查找对我有用,但其他人可以尝试被动模式。谢谢。 - Dave McLaughlin

0

尝试移除#sort!(只保留puts "files = #{files}"),因为如果目录中有大量文件,这可能会非常昂贵。这将解决在#nlst#ls周围出现的长时间延迟问题。


谢谢,但在这种情况下几乎没有什么区别 - 目录中只有大约十几个文件。通过分析器,#sort花费0.00毫秒。我已经在调试器中逐步(或者更确切地说是下一步)执行了代码,发现是#nlst和#ls需要时间。 - Dave McLaughlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接