2012-10-16 34 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