0

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

这是为什么?

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

编辑:

您可以填充一串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)
4

1 回答 1

0

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

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

于 2012-10-16T02:48:01.737 回答