与另一台笔记本电脑相比,使用python脚本上传需要很长时间

时间:2012-09-13 12:20:23

标签: python upload ftp

我有一个python 2.7代码,它使用STORBINARY函数将文件上传到ftp服务器,并使用RETRBINARY从该服务器下载。

然而,问题是与戴尔笔记本电脑相比,不同品牌的三台笔记本电脑上传需要很长时间。奇怪的是,当我手动上传任何文件时,所有系统都需要相同的时间。

使用python脚本的手动上传速率和上传速率在Dell笔记本电脑上是相同的。然而,在其他所有品牌的笔记本电脑上(我曾尝试使用IBM,东芝,富士通 - 西门子),python脚本的上传率非常低于手动尝试。此外,在所有这些其他笔记本电脑上,使用python脚本的上传速率是相同的(1Mbit / s),而手动上传速率是大约。 8 Mbit / s。

我试图改变上传的文件大小无济于事。 TCP Optimizer提高了所有系统的下载速率,但对上传速率没有影响。在所有系统上使用此脚本的下载速率很好,与手动下载速率相同。

我检查了服务器,它有超过90%的可用空间。所有笔记本电脑的网络连接都是相同的,我尝试一次仅上传一台笔记本电脑。所有笔记本电脑都具有几乎相同的系统配置,相同的操作系统和大致相同的可用驱动器空间。如果戴尔笔记本电脑的处理能力和内存比其他两款笔记本电脑少一些,但我认为这没有任何影响,因为我已多次检查这些上传期间的CPU使用率和网络使用量是多少下载,我相信没有其他病毒或程序占用我的带宽。


即使使用'storbinary'命令,当我指定块大小为57344(56 kB)时,上传速率从原来的1到1.5 Kbit / s提高到大约5 Kbit / s ...原因是什么?我怎样才能找到我的手动上传客户端使用的块大小(我使用的是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)

3 个答案:

答案 0 :(得分:0)

请提供代码的工作示例......但无法看到如何实现ftp功能,无法提供有用的反馈,但一般情况下,您可能会受益于使用线程或套接字。

答案 1 :(得分:0)

我可能错了,但似乎问题在于你调用和使用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...'

答案 2 :(得分:0)

Python主要用于脚本和流程自动化,从技术上讲,它不是一种快速变化的语言(虽然比大多数其他脚本语言更快)。 Filezilla使用C / C ++编码,在性能上远远优于Python。话虽如此,它不是一个公平的比较,我们应该在尝试识别可能导致一般性能问题的逻辑问题时考虑它。

storbinary基本上充当ntransfercmd的包装器,调用ntransfercmd而不需要我们定义自己的缓冲区(因此我之前推荐的原因)。

此外,在再次分析你的代码片段之后,我注意到你通过print语句调用storbinary ......这是错误的吗?

此时,我们需要此示例中使用的所有相关代码来识别可能影响性能的逻辑问题,请在之前的剪辑上构建,以便为我们提供其他信息。

此处需要考虑的另一个因素是进行测试的一般系统环境......考虑您所执行的每个系统的位置测试,距离FTP服务器有多远,另外还有差异。在解决与基于TCP / IP的连接(如ftp)相关的性能问题时,ISP或DNS服务器可能会成为主要因素。