在python中基本类型的轻量级泡菜?

时间:2009-02-10 16:03:57

标签: python serialization pickle

我想做的就是序列化和反序列化字符串或整数元组。

我查看了pickle.dumps(),但字节开销很大。基本上它看起来占用了大约4倍的空间。此外,我需要的只是基本类型,不需要序列化对象。

marshal在空间方面稍好一些,但结果却充满了令人讨厌的\ x00字节。理想情况下,我希望结果是人类可读的。

我想过只使用repr()和eval(),但是有一种简单的方法可以在不使用eval()的情况下实现这一点吗?

这将存储在数据库中,而不是文件中。字节开销很重要,因为它可以在需要TEXT列和varchar之间产生差异,通常数据紧凑性会影响db性能的所有区域。

7 个答案:

答案 0 :(得分:13)

看看json,至少生成的dumps可以与许多其他语言一起使用。

  

JSON(JavaScript Object Notation)http://json.org是JavaScript语法的一个子集(ECMA-262第3版),用作轻量级数据交换格式。

答案 1 :(得分:8)

我个人会使用yaml。它与json的编码大小相同,但它可以在必要时代表一些更复杂的东西(例如类,递归结构)。

In [1]: import yaml
In [2]: x = [1, 2, 3, 'pants']
In [3]: print(yaml.dump(x))
[1, 2, 3, pants]

In [4]: y = yaml.load('[1, 2, 3, pants]')
In [5]: y
Out[5]: [1, 2, 3, 'pants']

答案 2 :(得分:8)

也许你没有使用正确的协议:

>>> import pickle
>>> a = range(1, 100)
>>> len(pickle.dumps(a))
492
>>> len(pickle.dumps(a, pickle.HIGHEST_PROTOCOL))
206

请参阅pickle data formats的文档。

答案 3 :(得分:6)

如果您需要节省空间的解决方案,可以使用Google协议缓冲区。

Protocol buffers - Encoding

Protocol buffers - Python Tutorial

答案 4 :(得分:1)

python documentation中提到了一些持久性内置函数,但我认为在生成的文件大小中,这些内容并不显着。

你总是可以使用configparser,但你只能得到string,int,float,bool。

答案 5 :(得分:0)

“字节开销很大”

为什么这很重要?它完成了这项工作。如果你的磁盘空间不足,我很乐意以500美元的价格卖给你1Tb。

你运行它吗?性能是一个问题吗?你能证明序列化的表现是 问题吗?

“我想过只使用repr()和eval(),但是有一种简单的方法可以在不使用eval()的情况下实现这一点吗?”

没有什么比repr和eval简单。

eval有什么问题?

是“有人可以将恶意代码插入我序列化列表的文件中”问题吗?

谁 - 具体 - 是要查找和编辑此文件以存入恶意代码?你为确保这一点而做的任何事情(即加密)都会从中删除“简单”。

答案 6 :(得分:-1)

幸运的是有解决方案使用COMPRESSION并解决 涉及任意Python对象的一般问题 包括新课程。而不是微观管理 元组有时最好使用DRY工具 您的代码将更加清晰,易于重构 在类似的未来情况下。

y_serial.py module ::使用SQLite的仓库Python对象

“序列化+持久性::在几行代码中,将Python对象压缩并注释为SQLite;然后通过关键字按时间顺序检索它们,而不使用任何SQL。最有用的”标准“模块,用于存储无模式数据的数据库。“

http://yserial.sourceforge.net

[如果你仍然担心,为什么不坚持这些元组 字典,然后将y_serial应用于字典。 由于透明,可能任何开销都会消失 zlib在后台压缩。]

关于可读性,文档还提供了详细信息 为什么选择cPickle而不是json。