2012-11-27 23 views
0

最近我遇到了一個奇怪的問題,希望這裏有人能幫助我。我在Ubuntu12.04中使用Python2.7,Python和OS都是64位。stringio.write和+ =上的字節流不同

在我的代碼中,我需要繼續將傳入的數據流附加到字節數組, 我使用self.data + = incomingdata來實現此目的,其中incomingdata是我從硬件設備接收的數據。然後,我會在稍後解壓字節數組以解析接收到的數據。附加和解析操作全部通過鎖保護。

這裏的問題是,當我使用「+ =」追加字節流時,數據似乎在某些點被破壞(不一致)。沒有內存使用錯誤,沒有溢出等。我監視了程序的內存使用情況,看起來不錯。

然後,當我改變「+ =」到cStringIO.write來實現附加操作時,完全沒有問題,儘管它似乎比「+ =」操作慢。

誰能告訴我cStringIo.write和「+ =」在使用字節流時的區別是什麼? 「+ =」操作是否會導致任何潛在的問題?

回答

1

而不是使用+=你可能有更好的運氣創建一個列表並將數據附加到它的末尾。當所有的數據被提取後,你可以做一個''.join(list)創建一個單一的字符串。由於字符串連接效率低,這將會更好地預處理。

當你連接兩個字符串時,python必須分配新的內存來存儲新的字符串。如果你正在進行大量的連接,這可能非常慢。隨着字符串大小的增加,執行並置所花費的時間將會增加,並且如果您以這種方式獲取大量數據,它可能會壓倒處理器並導致其他操作被延遲。

我有一個類似的問題,當我建立一個重新組裝TCP流的Python進程。我捕獲的每個數據包都使用串聯添加到字符串中。一旦字符串增長了幾MB,我使用的數據包捕獲庫就開始丟幀了,因爲CPU花了很多時間進行字符串連接。一旦我切換到使用列表並加入結果,問題就消失了。

cStringIO.write之所以沒有這個問題,是因爲它通過在內存中創建一個虛擬文件並將數據附加到該文件而不必每次爲新字符串重新分配空間來操作。

+0

聽起來像'cStringIO.write()'可能更適合OP的用例......加上他們使用它的代碼版本已經存在。 – martineau

+0

是的,我可能會使用它。 –