7

私がやりたいのは、文字列または int のタプルをシリアライズおよびアンシリアライズすることだけです。

pickle.dumps() を見ましたが、バイトのオーバーヘッドが大きいです。基本的に、必要なスペースの約 4 倍を占めるように見えます。その上、必要なのは基本的な型だけで、オブジェクトをシリアル化する必要はありません。

marshal はスペースの点で少し優れていますが、結果は厄介な \x00 バイトでいっぱいです。理想的には、結果を人間が読めるようにしたいと考えています。

repr() と eval() だけを使用することを考えましたが、eval() を使用せずにこれを達成できる簡単な方法はありますか?

これは、ファイルではなくデータベースに保存されます。TEXT 列と varchar の要求に違いが生じる可能性があるため、バイト オーバーヘッドは重要です。一般に、データのコンパクトさは db パフォーマンスのすべての領域に影響します。

4

7 に答える 7

13

jsonを見てください。少なくとも、生成されたdumpsものは他の多くの言語で読み取ることができます。

JSON(JavaScript Object Notation)http://json.orgは、軽量のデータ交換形式として使用されるJavaScript構文(ECMA-262第3版)のサブセットです。

于 2009-02-10T16:28:58.917 に答える
8

たぶんあなたは正しいプロトコルを使用していません:

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

ピクルスデータ形式については、ドキュメントを参照してください。

于 2009-02-10T17:39:57.187 に答える
1

Python のドキュメントに言及されているいくつかの永続化ビルトインがありますが、これらのいずれも、生成されたファイルサイズが著しく小さいとは思いません。

いつでもconfigparserを使用できますが、string、int、float、bool しか取得できません。

于 2009-02-10T16:15:16.080 に答える
0

「バイトのオーバーヘッドが大きい」

なぜこれが重要なのですか?それは仕事をします。ディスク容量が不足している場合は、喜んで 1 TB を 500 ドルで販売いたします。

実行しましたか?パフォーマンスは問題ですか?シリアル化のパフォーマンスが問題であることを証明できますか?

「repr() と eval() だけを使用することを考えましたが、eval() を使用せずにこれを達成できる簡単な方法はありますか?」

repr と eval ほど単純なものはありません。

eval の何が問題になっていますか?

「リストをシリアライズしたファイルに悪意のあるコードが挿入される可能性がある」という問題はありますか?

このファイルを見つけて編集し、悪意のあるコードを挿入するのは誰でしょうか? これを保護するために行うこと(つまり、暗号化)は、そこから「単純」を取り除きます。

于 2009-02-10T16:15:50.570 に答える
-1

幸いなことに、COMPRESSION を使用して、新しいクラスを含む任意の Python オブジェクトに関する一般的な問題を解決するソリューションがあります。単なるタプルを細かく管理するよりも、DRY ツールを使用する方がよい場合があります。
コードはより鮮明になり、同様の将来の状況で容易にリファクタリングされます。

y_serial.py モジュール :: SQLite を使用したウェアハウス Python オブジェクト

「シリアライゼーション + 永続化 :: 数行のコードで、Python オブジェクトを圧縮して SQLite に注釈を付けます。その後、SQL を使用せずに、キーワードによって時系列でそれらを取得します。データベースがスキーマのないデータを格納するための最も有用な「標準」モジュール。」

http://yserial.sourceforge.net

[それでも心配なら、それらのタプルを辞書に貼り付けてから、y_serial を辞書に適用してください。おそらく、zlib によるバックグラウンドでの透過的な圧縮により、オーバーヘッドはなくなります。]

読みやすさに関しては、ドキュメントには、json ではなく cPickle が選択された理由の詳細も記載されています。

于 2009-09-17T08:09:07.503 に答える