【问题标题】:saving a long string using cPickle - saved variable is truncated使用 cPickle 保存长字符串 - 保存的变量被截断
【发布时间】:2012-10-16 01:27:39
【问题描述】:

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

这是为什么呢?

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

编辑:

您可以填充随机值的字符串b,这样您就可以使用您喜欢的技术获得 4807100171 的长度 - 可能类似于一个简单的 for 循环到 4807100171。我个人使用 Huffman 编码加密原始数据,但它会是一个我觉得在这里没有必要的长例子。 然后我将字符串b 转储如下:

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

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

【问题讨论】:

  • 为什么不能使用bytearray并以二进制模式写入文件(wb)?
  • 你知道为什么字符串会被pickle.dump截断吗?
  • bytearray 似乎不是一个好方法...创建的文件是 4,81 Go... 这次我没有使用 pickle,而是这样做:使用 open('. ./string.p', 'wb') as f: f.write(bytearray(b))

标签: python pickle truncated


【解决方案1】:

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

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

【讨论】:

  • 我知道它是一个长字符串——这就是我首先尝试 bitarray 的原因。我实际上是在尝试压缩一个已经很大的文件。使用 bitarray 似乎也存在长度问题。但是,这可能与您指出的类似问题!你可以在这里查看我之前的帖子(我还没来得及更新一个好的代码示例):stackoverflow.com/questions/12449741/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
相关资源
最近更新 更多