【问题标题】:Write on File UDP bytes received with python写入使用 python 接收的文件 UDP 字节
【发布时间】:2018-06-14 09:56:20
【问题描述】:

我正在开发一个 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。 有什么建议吗?

【问题讨论】:

    标签: python sockets udp fpga


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这是一个旧的 linux 服务器,有 8GB 内存和 250GB 硬盘,不幸的是我无法升级硬盘或添加 SSD,因为它不是我的服务器,但我可以明确地尝试保存较新的电脑,看看它是否真的是硬件问题。感谢您的快速回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多