【问题标题】:different between stringio.write and += on byte streamstringio.write 和 += 在字节流上的不同
【发布时间】:2012-11-27 16:00:42
【问题描述】:

我最近遇到一个奇怪的问题,希望有人能帮助我。我在Ubuntu12.04中使用的是Python2.7,python和OS都是64位的。

在我的代码中,我需要不断将传入的数据流附加到一个字节数组中, 我使用 self.data += incomingdata 来实现这个,incomingdata 是我从硬件设备接收到的数据。然后我会稍后解压字节数组来解析接收到的数据。追加和解析操作都有锁保护。

这里的问题是,当我使用“+=”附加字节流时,数据似乎在某些时候被破坏了(并非始终如一地发生)。没有内存使用错误,没有溢出等。我监控了程序的内存使用情况,看起来不错。

然后,当我将“+=”改为cStringIO.write来实现追加操作时,完全没有问题,虽然它似乎比“+=”操作慢。

谁能告诉我当 cStringIo.write 和 "+=" 用于对字节流进行操作时,它们之间的确切区别是什么? "+=" 操作是否会导致任何潜在问题?

【问题讨论】:

    标签: python python-2.7 bytearray stringio


    【解决方案1】:

    而不是使用+=,您可能会更幸运地创建一个列表并将数据附加到它的末尾。获取所有数据后,您可以执行''.join(list) 来创建单个字符串。由于字符串连接效率低下,这将执行得更好。

    当你连接两个字符串时,python 必须分配新的内存来存储新的字符串。如果你正在做大量的连接,这可能真的很慢。随着字符串大小的增加,执行连接所需的时间也会增加,如果您以这种方式获取大量数据,它可能会使处理器不堪重负并导致其他操作延迟。

    当我构建一个重新组装 TCP 流的 python 进程时,我遇到了类似的问题。我捕获的每个数据包都使用连接添加到字符串中。一旦字符串增长到几 MB,我使用的数据包捕获库就开始丢帧,因为 CPU 花费大量时间进行字符串连接。一旦我切换到使用列表并在最后加入结果,问题就消失了。

    cStringIO.write 没有这个问题的原因是它通过在内存中创建一个虚拟文件并将数据附加到该文件而无需每次都为新字符串重新分配空间。

    【讨论】:

    • 听起来像 cStringIO.write() 可能更适合 OP 的用例......加上他们的代码版本已经存在。
    • 是的,我可能也会使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多