使用Python提高UDP传输速度的最佳方法是什么?

时间:2016-06-23 14:50:07

标签: python performance sockets udp

我编写了一个Python程序,用于通过UDP发送和接收大文件。现在,当使用万兆以太网电缆在两台计算机之间进行传输时,我可以达到约.01GB / s的速度。我希望显着提高速度,但我不确定最佳方法是什么。

对于它的价值,我必须使用UDP 进行转移。我编写的程序仅仅是对较大项目的测试,发送该项目数据的设备无法使用TCP流。此外,我主要关注快速接收数据报的最佳方式,或者至少是确保接收端不会发生任何瓶颈的最佳方式。

现在,我的程序通过将一个大文件分成几个将成为要发送的数据报的工作来工作。发送这些数据报,然后接收器执行一些操作以确保它获得正确的数据并相应地对其进行排序。

发送代码(细分为基础)

buf = 32000  #Size of each chunk/packet
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
host ="127.0.0.1"
port = 5005
addr = (host,port)    

def read_in_chunks(infile, chunk_size=buf):
"""Chunk the file before we send it.
Arguments:
infile -- the file to chunk
chunk_size -- the size of the chunk in bytes (default 32KB)
"""
    while True:
        chunk = infile.read(chunk_size)
        if chunk:
            yield chunk
        else:
            # The chunk was empty, which means we're at the end of the file
            return

def run():
    for chunk in read_in_chunks(f):
        if(s.sendto(chunk,addr) and s.sendto(id,addr)):
            #Some acknowledgment stuff - removed for clarity (also noted to not impact performance)
            local_ID += 1

接收代码:

UDP_IP = "127.0.0.1"
UDP_PORT = 5005
buf = 32000  # Buffer size in bytes for each chunk
sock = socket.socket(socket.AF_INET,  # Internet
                 socket.SOCK_DGRAM)  # UDP
sock.bind((UDP_IP, UDP_PORT))

try:
    while(dataChunk):
        actualNumChunks += 1
        f.write(dataChunk)
        sock.settimeout(2)
        dataChunk, addr = sock.recvfrom(buf)
        packID, junkAddr = sock.recvfrom(buf)
        packIDString = str(packID)
except socket.timeout:
    f.close()
    sock.close()
    print "File received!"  # --KEEP
    print "A total of " + str(actualNumChunks) +" chunks were received"            --KEEP

我不确定优化我的代码是否是问题(尚待测试),或者是否有另一种(更好的?)方式来提高文件传输的速度。如果这里的细节很少,我很抱歉,但如果您需要更多信息,请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试的一些方法:

  1. 不同的数据包大小(取决于MTU,可能会导致数据块碎片化为多个数据包,或者可能太小而无法最佳地使用管道)
  2. 将文件读入内存(网络速度可能是10gbps,但磁盘速度较慢,特别是如果它不是SSD - 通常是一个数量级或更慢),在它全部开始后开始发送被缓存了。您可以尝试多次发送相同的数据块,以检查这是否是瓶颈。
  3. 压缩可能有所帮助。 ZLIB非常非常快,意味着您可以以更短的时间传输更多数据,
  4. 其他要点:

    • 即使在简单的1对1链接中,数据包丢失和排序也可能导致正常的传输问题。您需要使用错误检测/重试功能才能实现此功能。
    • 内核/用户模式更改可能会降低您的速度(怀疑它,这是超级微优化)