我有一个python2.7代码,它使用STORBINARY函数将文件上传到ftp服务器,使用RETRBINARY从该服务器下载文件。
然而,问题是,与戴尔笔记本相比,来自不同品牌的三台笔记本电脑的上传需要很长时间。奇怪的是,当我手动上传任何文件时,在所有系统上都需要相同的时间。
在戴尔笔记本电脑上,使用python脚本的手动上传速率和上传速率是相同的。然而,在所有其他品牌的笔记本电脑上(我曾尝试过IBM、东芝、富士通-西门子),python脚本的上传速率非常低。而且,在所有这些其他笔记本电脑上,使用python脚本的上传速率是相同的(1 1Mbit/s),而手动上传速率大约是1 1Mbit/s。8 Mbit/s。
我试图改变上传的文件大小,但没有效果。TCP优化器提高了所有系统的下载速率,但对上传速率没有影响。在所有系统上使用此脚本的下载速度都很好,与手动下载速度相同。
我已经检查了服务器,它有超过90%的空闲空间。所有的笔记本电脑的网络连接都是一样的,我一次只能上传一台笔记本电脑。所有的笔记本电脑几乎都有相同的系统配置,相同的操作系统和大致相同的自由空间。如果说戴尔笔记本电脑在处理能力和内存方面比其他两台要小一些的话,但我想这不会有任何影响,因为我已经检查了很多次,看看在上传和下载过程中CPU的使用和网络的使用情况,而且我确信没有其他病毒或程序占用了我的带宽。
即使使用“存储二进制”命令,当我指定块大小为57344(56 kB)时,上传速率也从1 Kbit/s提高到大约5 Kbit/s originally...whats,原因是什么?我如何才能找到手动上传客户端(我使用filezilla)使用的块大小,或者更好地找到上传的最佳块大小??@guidot。
完整代码:
def upnew(counter=0):
f=open("c:/10", "w")
f.write(os.urandom(10*1024*1024))
f.close()
print "Logging in..."
ftpserver='xxxxxxx'
ftpuser='xxxxxxx'
ftppw='xxxxxxxxx'
ftp = FTP(ftpserver)
ftp.login(ftpuser, ftppw)
t = open("c:/10", "rb")
upstart = time.clock()
ftp.storbinary('STOR 10', t)
upende = time.clock()-upstart
print ((10*8)/upende)
print "press Return to disconnect"
raw_input()
ftp.quit()
print "FTP Verbindung abgebaut"
upnew(1)发布于 2012-09-13 12:32:54
请提供代码的工作样本..。如果不能看到您如何实现ftp函数,就不可能提供有用的反馈,但一般来说,使用线程或套接字可能会使您受益。
发布于 2012-09-13 14:47:50
我可能错了,但问题似乎在于调用和使用ftp.storbinary()的方式。
我将尝试使用ftp.ntransfercmd()代替,并在传输过程中使用一个缓冲区来分解传输。这使您能够跟踪ftp传输的进度,并在理论上允许您根据需要暂停和重新启动进程,这带来了额外的好处。
还没有测试过这个脚本的性能,但是您可以尝试这样做:
def ftpUploader():
BLOCKSIZE = 57344 # size 56 kB
ftp = ftplib.FTP()
ftp.connect(host)
ftp.login(login, passwd)
ftp.voidcmd("TYPE I")
f = open(zipname, 'rb')
datasock, esize = ftp.ntransfercmd(
'STOR %s' % os.path.basename(zipname))
size = os.stat(zipname)[6]
bytes_so_far = 0
print 'started'
while 1:
buf = f.read(BLOCKSIZE)
if not buf:
break
datasock.sendall(buf)
bytes_so_far += len(buf)
print "\rSent %d of %d bytes %.1f%%\r" % (
bytes_so_far, size, 100 * bytes_so_far / size)
sys.stdout.flush()
datasock.close()
f.close()
ftp.voidresp()
ftp.quit()
print 'Complete...'发布于 2012-09-14 17:33:24
Python主要用于脚本编写和过程自动化,在技术上不被认为是一种不同的快速语言(虽然比大多数其他脚本语言更快)。Filezilla是使用C/C++编写的,在性能上远远优于Python。尽管如此,这是一个不公平的比较,我们在试图找出逻辑上可能导致一般业绩问题的问题时,应该考虑到这一点。
存储二进制文件基本上充当ntransfercmd的包装器,调用ntransfercmd而不需要我们定义自己的缓冲区(因此我先前建议使用它)。
另外,在再次分析您的代码片段之后,我注意到您通过print语句调用storbinary .这是错误的吗?
此时,我们将需要本例中使用的所有相关代码来识别逻辑中可能影响性能的任何问题,请在前面的snip基础上提供更多信息。
这里需要考虑的另一个因素是进行测试的一般系统环境.考虑您预先设置的每个测试系统的位置,它们离ftp服务器有多远,另外,在解决与基于TCP/IP的连接(如FTP )相关的性能问题时,ISP或DNS服务器的差异可能是一个主要因素。
https://stackoverflow.com/questions/12406109
复制相似问题