web-dev-qa-db-ja.com

Python:リストをファイルに書き込んでから、それをメモリに戻すにはどうすればよいですか(dictは文字列として表現され、dictに変換されます)?

875228—Pythonでの単純なデータ格納 のより具体的な説明。

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

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

次のように簡略化します:{((( 'Word'、 'list')、(1,2)、(1,3))、(...)):0.0、....}

pythonは、文字列をループして:と(を辞書に解析しようとするよりも、.

30
RodLaCour

なぜ 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よりも遅い場合があります。

61
Nadia Alramli

他の回答で示唆されているように、私は shelvejsonyamlなどを使用します。

shelveは、dictをディスク上に置いて引き続き使用できるため、特に優れています。値はオンデマンドで読み込まれます。

しかし、本当にdictのテキストを解析する必要があり、テキストにstrings、ints、およびTuplesのみが含まれている場合は、使用する - ast.literal_eval 解析します。完全な式を評価することはできないため、はるかに安全です。strings、numbers、Tuples、lists、dictsでのみ機能します、booleans、およびNone

>>> import ast
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}")
{12: 'mydict', 14: (1, 2, 3)}
12
nosklo

ファイル形式に [〜#〜] 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/ を参照

簡単なファイル保存/読み込み機能が付いているので、今すぐ覚えることはできません。

4
Tom Leys

要件に応じて、いくつかの選択肢があります。

  • numpyは、プレーンデータをコンパクトな形式で格納し、グループ/質量演算を適切に実行します

  • shelveは、ファイルでバックアップされた大きな辞書のようなものです

  • 一部のサードパーティ製ストレージモジュール(例: stash、任意のプレーンデータを格納します

  • 適切なデータベース、例えば毛深いデータまたはmysqlまたはsqliteのプレーンデータとより高速な取得のためのmongodb

0
Dima Tisnek

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

y_serial.pyモジュール::ウェアハウスPythonオブジェクト

"シリアライゼーション+パーシスタンス::数行のコードで、PythonオブジェクトをSQLiteに圧縮して注釈を付けます。その後、SQLを使用せずに、キーワードによってオブジェクトを時系列で取得します。データベースにとって最も便利な「標準」モジュールスキーマのないデータを保存します。」

http://yserial.sourceforge.net

圧縮ボーナスにより、6 GBの辞書が1 GBに減少するでしょう。一連の辞書を保存したくない場合は、モジュールにfile.gzソリューションも含まれています。

0
code43

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

0
workmad3