写入使用python接收的文件UDP字节

时间:2018-06-14 09:56:20

标签: python sockets udp fpga

我正在开发一个python程序,它可以让我与FPGA通信,通过UDP向我发送大约109 MB / s的数据包。我现在有一个问题,我愿意解决:

FPGA每个数据包发送1400个字节(二进制),我想将它们保存在文件中。现在,这部分代码看起来像这样(它是多进程实例调用的函数):

filio = open('pack.bin',"wb")
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)    
sock.bind(('',int(udportr.get())))
start = "Starting..."
q.send(start)
t = Timer(1, lambda:q.send(a))
t.start()
a = 0
while True:
    data, addr = sock.recvfrom(1400)     
    if checksave.get() == 1:
        filio.write(data)                        
    if t.is_alive():
        a +=1
    else:
        start_time = time.time()
        print a 
        t = Timer(1, lambda:q.send(a))  # q refers to a Pipe
        t.start()
        a = 0             
sock.close()    

问题是,当我在大约2 GB之后写入文件时,速率会降低很多,达到30 MB / s。只有当我试图保存文件时才会发生这种情况,否则速率将保持恒定在~109 MB / s。 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

2GB阈值可能暗示硬件问题。你在运行这个程序是什么?

当您写入文件时,通常数据不会直接写入硬盘驱动器,而是写入缓存。这可以在HDD缓存,RAM,交换或任何其他快速内存之间分配(取决于您的特定硬件和操作系统)。然后将数据(缓慢地)复制到后台的硬盘驱动器中。这允许看似快速写入磁盘,但只有在有空闲缓存空间的情况下才能工作。

也许你的系统有大约2GB的可用写入缓存,一旦填满,你的写入速度就会受到原始磁盘写入速度的限制。 30MB / s对于HDD来说不是很好,但它仍然可以保持连贯。

如果这实际上是问题,解决方案是升级您的硬件。你可以添加SSD来写这个文件吗? 否则,您也可以在写入之前压缩数据。这将减少您必须编写的数量,从而解决(或至少减少)您当前的问题,但这将导致处理能耗的后续成本。

相关问题