繁体   English   中英

python中的基本类型的轻质泡菜?

[英]Lightweight pickle for basic types in python?

我要做的就是对字符串或整数的元组进行序列化和反序列化。

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

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

我想到了只使用repr()和eval(),但是有没有一种简单的方法可以在不使用eval()的情况下完成此任务?

这将存储在数据库中,而不是文件中。 字节开销很重要,因为它可能使需要TEXT列与varchar有所不同,并且通常数据紧凑性会影响db性能的所有方面。

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

JSON(JavaScript对象表示法) http://json.org是JavaScript语法(ECMA-262第三版)的子集,用作轻量级数据交换格式。

我个人将使用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']

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

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

请参阅文档以获取泡菜数据格式

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

协议缓冲区-编码

协议缓冲区-Python教程

python文档中提到了一些持久性内建函数,但我认为在生成的文件大小中,这些内建函数中的任何一个都不显着。

您可以一直使用configparser,但是在那里您只能得到string,int,float,bool。

“字节开销很大”

为什么这么重要? 它完成了工作。 如果您的磁盘空间不足,我很高兴以500美元的价格向您出售1Tb。

你跑了吗? 性能有问题吗? 你能证明系列化的表现什么问题?

“我想过只使用repr()和eval(),但是有没有一种简单的方法可以不用eval()来实现这一目标呢?”

没有比repr和eval更简单的了。

评估有什么问题?

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

谁(特别是)要查找和编辑此文件以放入恶意代码的人? 您为保护此安全所做的任何事情(即加密)都会从中删除“简单”的内容。

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

y_serial.py模块::使用SQLite仓库Python对象

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

http://yserial.sourceforge.net

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM