stringio.write与字节流上的+ =之间有所不同

时间:2012-11-27 16:00:43

标签: python python-2.7 bytearray stringio

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

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

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

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

有人能告诉我cStringIo.write和“+ =”在用于字节流操作时有什么区别吗? “+ =”操作会导致任何潜在的问题吗?

1 个答案:

答案 0 :(得分:1)

您可以更好地创建列表并将数据附加到其末尾,而不是使用+=。获取完所有数据后,您可以执行''.join(list)创建单个字符串。由于字符串连接效率低下,因此预处理会更好。

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

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

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