使用Python提高UDP传输速度的最佳方法



我写了一个Python程序,用于通过UDP发送和接收大型文件。目前,当在10千兆以太网电缆上两台计算机之间传输时,我可以达到约0.01GB/s的速度。我希望显着提高这种速度,但我不确定最好的方法是什么。

为了达到价值,i 必须使用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. 各种数据包大小(取决于MTU,可能会导致块被碎片到几个数据包,或者可能太小而无法最佳使用管道)
  2. 将文件读取到内存(网络速度可能是10Gbps,但是磁盘的速度较慢,尤其是当它不是SSD的情况下 - 通常是一个数量级或更慢的顺序)。您可以尝试多次发送相同的数据块,以检查这是否是瓶颈。
  3. 压缩可能会有所帮助。Zlib非常非常非常非常快,这意味着您可以以更少的时间传输更多数据,

其他要点:

  • 数据包丢失和订购可能会使适当的转移有问题,即使在简单的1比1链接中也是如此。您需要错误检测/重试功能才能工作。
  • 内核/用户模式更改可能会减慢您的速度(怀疑,这是超级优化)

对于您的接收器,您确实写了文件,这可能是瓶颈。要尝试的几件事就是写所有您的" datachunk"。排队。然后具有单独的线程或进程(多处理),该线程从该队列中读取,将写入文件写入文件。这会从您的while循环中卸载文件io,并可能允许您处理更多的数据包。

相关内容

最新更新