31

875228 のより具体的な重複 — Python での単純なデータの保存

かなり大きな dict (6 GB) があり、それに対して何らかの処理を行う必要があります。いくつかのドキュメント クラスタリング方法を試しているので、すべてを一度にメモリに格納する必要があります。このデータに対して実行する関数は他にもありますが、内容は変わりません。

現在、新しい関数を考えるたびに、それらを記述してから辞書を再生成する必要があります。この dict をファイルに書き込む方法を探しているので、すべての値を再計算する代わりにメモリにロードできます。

{((('word','list'),(1,2),(1,3)),(...)):0.0, ....}

: と ( を探して文字列をループして辞書に入れようとするよりも、Python の方が優れた方法を持っているに違いないと思います。

4

6 に答える 6

62

python pickleを使用しないのはなぜですか? Python には pickle と呼ばれる優れたシリアル化モジュールがあり、非常に使いやすいです。

import cPickle
cPickle.dump(obj, open('save.p', 'wb')) 
obj = cPickle.load(open('save.p', 'rb'))

ピクルスには2つの欠点があります。

  • 誤ったデータや悪意を持って作成されたデータに対しては安全ではありません。信頼できない、または認証されていないソースから受け取ったデータを unpickle しないでください。
  • このフォーマットは人間が読めるものではありません。

Python 2.6 を使用している場合、jsonという組み込みモジュールがあります。ピクルスと同じくらい簡単に使用できます。

import json
encoded = json.dumps(obj)
obj = json.loads(encoded)

Json 形式は人間が判読でき、Python の辞書文字列表現に非常に似ています。また、ピクルスのようなセキュリティ上の問題はありません。ただし、cPickle よりも遅い場合があります。

于 2009-05-20T22:07:34.350 に答える
12

他の回答で示唆されているように、、、、、または何でも使用しshelveます。jsonyaml

shelvedictディスク上に置いて使用できるので、特にクールです。値はオンデマンドでロードされます。

ただし、本当にのテキストを解析したい場合で、表示したようにings、s、sdictのみが含まれている場合は、を使用して解析できます。完全な式を評価できないため、はるかに安全です-ings、 numbers、s、s、s、eans、および:でのみ機能します。strinttupleast.literal_evalstrtuplelistdictboolNone

>>> import ast
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}")
{12: 'mydict', 14: (1, 2, 3)}
于 2009-05-20T23:12:21.193 に答える
4

ファイル形式にYAMLを使用することをお勧めします。これにより、ディスク上でそれをいじることができます。

How does it look:
  - It is indent based
  - It can represent dictionaries and lists
  - It is easy for humans to understand
An example: This block of code is an example of YAML (a dict holding a list and a string)
Full syntax: http://www.yaml.org/refcard.html

Python で取得するには、easy_install pyyaml を実行するだけです。http://pyyaml.org/を参照

今すぐ思い出せない、簡単なファイルの保存/読み込み機能が付属しています。

于 2009-05-20T22:57:08.667 に答える
0

pickle(シリアル化用のPython標準ライブラリモジュール)などのシリアル化された形式で、またはおそらくJSON(メモリ表現を再度生成するために評価できる表現)を使用して書き出します。

于 2009-05-20T22:27:09.380 に答える
0

SourceForge のこのソリューションでは、標準の Python モジュールのみを使用します。

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

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

http://yserial.sourceforge.net

圧縮ボーナスにより、おそらく 6GB の辞書が 1GB に削減されます。一連の辞書を保存したくない場合、モジュールには file.gz ソリューションも含まれており、辞書のサイズを考えるとより適している可能性があります。

于 2009-10-02T23:20:55.037 に答える