2012-10-16 33 views
0

我將0和1的字符串長度爲4807100171的字符串轉儲爲pickle文件,因爲我之前遇到過bitarray的問題,並希望看看pickle是否可以解決我的問題。但是,在我加載它之後,它現在的長度爲512132875.使用cPickle保存一個長字符串 - 保存的變量被截斷

爲什麼?

我有搜索,查看是否有來自泡菜任何限制,但我沒有發現任何東西......如果有一個衆所周知的原因,我可能不會使用被正確的關鍵詞...

編輯:

您可以填寫隨機值的字符串b所以你得到的與4807100171技術的長度你喜歡 - 也許像一個簡單的for循環要4807100171.我使用霍夫曼編碼加密的個人原始數據,但它這將是一個很長的例子,我覺得在這裏並不是真的有必要。 我然後轉儲字符串b如下:

b = "" 
for i in range(4807100171) 
    b += 0 

import cPickle as pickle 
pickle.dump(b, open("string.p", "wb"), pickle.HIGHEST_PROTOCOL) 
+0

你能顯示一些代碼嗎? – jdi

+0

爲什麼不能使用'bytearray'並以二進制模式寫入文件('wb')? – jozzas

+0

你知道爲什麼使用pickle.dump截斷字符串嗎? – macrocosme

回答

0

這顯然是一個整數溢出問題 - 請注意4807100171零下2 ** 32爲512132875.不幸的是,32位整數是二進制格式鹹菜如何代表字符串長度。看起來使用文本pickle格式(協議版本0)可以避免這個問題,但是文本pickle通常更長,並且會佔用荒謬的內存量來處理這種大小的字符串。我沒有真正測試過 - 我認爲我的計算機上沒有足夠的內存可以這麼做!

如果這一個字符串是唯一被存儲的東西,那麼只要將字符串本身寫入文件就簡單多了。

+0

我知道這是一個很長的字符串 - 這就是爲什麼我首先嚐試了bitarray。我實際上是在試圖壓縮一個已經很大的文件。使用bitarray似乎也有長度問題。但是,這可能與您所指出的問題類似。你可以在這裏查看我以前的帖子(我還沒有時間更新一個好的代碼示例):http://stackoverflow.com/questions/12449741/bitarray-to01-doesnt-return-only-0s-and -1s式串,蟒蛇 – macrocosme