簡體   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