2017-01-16 10 views
1

私は以下の問題に直面しています。私は大きなデータセット(数10GB)を作成します。ネストされた辞書として保存されたオブジェクトに関する情報を含む各オブジェクトのエントリを含むYAML形式の出力ファイルを作成したいと思います。しかし、私は決してメモリ内のすべてのデータを同時に保持しません。YAMLファイルを段階的に作成する

出力データは、オブジェクト名を保存された値にマッピングする辞書に格納する必要があります。シンプルなバージョンは次のようになります。

object_1: 
    value_1: 42 
    value_2: 23 

object_2: 
    value_1: 17 
    value_2: 13 

[...] 

object_a_lot: 
    value_1: 47 
    value_2: 11 

は、低メモリフットプリントを維持するために、私は、各オブジェクトのエントリを書いて、すぐに書き込んだ後、それを削除したいと思います。

from yaml import dump 

[...] # initialize huge_object_list. Here it is still small 
with open("output.yaml", "w") as yaml_file: 
    for my_object in huge_object_list: 
     my_object.compute() # this blows up the size of the object 

     # create a single entry for the top level dict 
     object_entry = dump(
      {my_object.name: my_object.get_yaml_data()}, 
      default_flow_style=False, 
     ) 
     yaml_file.write(object_entry) 

     my_object.delete_big_stuff() # delete the memory consuming stuff in the object, keep other information which is needed later 

を基本的に私はいくつかの辞書を書いていますが、それぞれが1つのキーだけを持っており、オブジェクト名は一意であるため、これが爆破されていません。次のように私の現在のアプローチがあります。これはうまくいきますが、ちょっとのビットのように感じます。誰かがこれをより良く/適切に行う方法を知っているかどうか尋ねたいと思います。

大きな辞書をYAMLファイルに書き込む方法はありますか?

答えて

1

YAMLファイルを段階的に書き出す場合は、記述したとおりに行うことができます。

あなたのキーは一意であることが保証されていない場合は、私が代わりにマッピングのも一つの項目でトップレベルAすなわちリスト()(シーケンスを使用することをお勧めしますが。

これは解決しませんPyYAMLがファイル全体を読み込もうとするとファイルを読み直す際の問題が発生しますが、PyYAMLのメモリオーバーヘッドはファイルを読み込むために必要となります。私のruamel.yamlはいくらか改善されましたが、メモリ内のファイルサイズの数十倍が必要です。

「先行する」スペースに基づいてファイルを切り取ることはもちろん可能です。新しいキー(またはあなたがシーケンスを使用する場合のアイテム)は、異なる方法で簡単に見つけることができます。 1つのファイル内の各キーと値のペアを1つのファイルに保存することもできます。これにより、単一のドキュメントのキーと値のペアを自分で組み合わせると、読み込み中のオーバーヘッドが大幅に削減されます。

同様の状況で、別のファイルに個別のYAML「オブジェクト」を保存し、ファイル名を「オブジェクト」値のキーとして使用しました。これには効率的なファイルシステム(テールパッキングなど)が必要で、システムの基になっているOSに基づいて利用できるものによって異なります。

+0

あなたのご意見ありがとうございました。これは非常に役に立ちました。私はメモリオーバーヘッドの問題を認識していませんでした。これが私のデータにとって問題になるかどうかを確認します。 – m00am

関連する問題