使用cPickle保存长字符串 - 保存的变量被截断

时间:2012-10-16 01:27:40

标签: python pickle truncated

我将一个0和1长度为4807100171的字符串转储到pickle文件中,因为我之前遇到了bitarray的问题,并希望看看pickle是否可以解决我的问题。但是,在我加载它之后,它现在的长度为512132875.

为什么?

我已经搜索过,看看是否有任何限制,但我没有找到任何东西......如果有一个众所周知的原因,我可能没有使用正确的关键词......

编辑:

你可以填充一个随机值的字符串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)

1 个答案:

答案 0 :(得分:0)

这显然是整数溢出问题 - 请注意4807100171减2 ** 32是512132875.不幸的是,32位整数是二进制pickle格式表示字符串长度的方式。看来使用文本pickle格式(协议版本0)可以避免这个问题,但是文本泡菜通常更长,并且需要一些荒谬的内存来处理这个大小的字符串。我还没有真正测试过这个 - 我不认为我的计算机上有足够的内存来这样做!

如果这一个字符串是唯一存储的字符串,那么将字符串本身写入文件会简单得多。