875228—Pythonでの単純なデータ格納 のより具体的な説明。
かなり大きな辞書(6 GB)があり、それに対して処理を行う必要があります。いくつかのドキュメントクラスタリング手法を試しているので、すべてを一度にメモリに格納する必要があります。このデータで実行する他の関数がありますが、内容は変更されません。
現在、新しい関数を考えるたびに、それらを記述し、dictを再生成する必要があります。このdictをファイルに書き込む方法を探しています。これにより、すべての値を再計算する代わりにメモリにロードできます。
次のように簡略化します:{((( 'Word'、 'list')、(1,2)、(1,3))、(...)):0.0、....}
pythonは、文字列をループして:と(を辞書に解析しようとするよりも、.
なぜ python pickle を使わないのですか? Pythonには、pickleと呼ばれる優れたシリアル化モジュールがあり、非常に使いやすいです。
import cPickle
cPickle.dump(obj, open('save.p', 'wb'))
obj = cPickle.load(open('save.p', 'rb'))
ピクルには2つの欠点があります。
python 2.6を使用している場合は、組み込みモジュール json があります。pickleと同じくらい簡単に使用できます。
import json
encoded = json.dumps(obj)
obj = json.loads(encoded)
Json形式は人間が読める形式で、Pythonの辞書文字列表現と非常によく似ています。ピクルスのようなセキュリティ上の問題はありません。ただし、cPickleよりも遅い場合があります。
他の回答で示唆されているように、私は shelve
、json
、yaml
などを使用します。
shelve
は、dict
をディスク上に置いて引き続き使用できるため、特に優れています。値はオンデマンドで読み込まれます。
しかし、本当にdict
のテキストを解析する必要があり、テキストにstr
ings、int
s、およびTuple
sのみが含まれている場合は、使用する - ast.literal_eval
解析します。完全な式を評価することはできないため、はるかに安全です。str
ings、numbers、Tuple
s、list
s、dict
sでのみ機能します、bool
eans、およびNone
:
>>> import ast
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}")
{12: 'mydict', 14: (1, 2, 3)}
ファイル形式に [〜#〜] 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/ を参照
簡単なファイル保存/読み込み機能が付いているので、今すぐ覚えることはできません。
要件に応じて、いくつかの選択肢があります。
numpy
は、プレーンデータをコンパクトな形式で格納し、グループ/質量演算を適切に実行します
shelve
は、ファイルでバックアップされた大きな辞書のようなものです
一部のサードパーティ製ストレージモジュール(例: stash
、任意のプレーンデータを格納します
適切なデータベース、例えば毛深いデータまたはmysqlまたはsqliteのプレーンデータとより高速な取得のためのmongodb
SourceForgeのこのソリューションは、標準のPythonモジュールのみを使用します。
y_serial.pyモジュール::ウェアハウスPythonオブジェクト
"シリアライゼーション+パーシスタンス::数行のコードで、PythonオブジェクトをSQLiteに圧縮して注釈を付けます。その後、SQLを使用せずに、キーワードによってオブジェクトを時系列で取得します。データベースにとって最も便利な「標準」モジュールスキーマのないデータを保存します。」
http://yserial.sourceforge.net
圧縮ボーナスにより、6 GBの辞書が1 GBに減少するでしょう。一連の辞書を保存したくない場合は、モジュールにfile.gzソリューションも含まれています。
Pickle(pythonシリアル化用の標準ライブラリモジュール)などのシリアル化された形式で、またはおそらくJSON(メモリ表現を生成するために評価できる表現です)を使用してそれを書き出します。 。