0

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

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

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

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

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

4

1 回答 1

1

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

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

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

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

于 2012-11-27T16:22:39.113 回答