大規模なデータセットを使用した計算問題のI / O戦略


15

私の研究グループは、分子動力学に焦点を当てています。分子動力学は、明らかに分析しなければならない単一の軌跡の一部としてギガバイトのデータを生成する可能性があります。

私たちが懸念している問題のいくつかは、データセットの相関関係に関係しています。つまり、より逐次的なアプローチを使用するのではなく、メモリ内の大量のデータを追跡して分析する必要があります。

私が知りたいのは、大規模なデータセットのI / Oをスクリプトに処理するための最も効率的な戦略です。通常、Pythonベースのスクリプトを使用するのは、ファイルI / OのコーディングがCやFortranよりもはるかに簡単になるためですが、処理する必要のある行が数千または数億ある場合、最適なアプローチが明確ではありません。Cでコードのファイル入力部分を実行することを検討する必要がありますか、または別の戦略がより便利ですか?(単に配列全体をメモリにプリロードする方が、一連の「チャンク」(メガバイトのオーダー)の順次読み取りよりも優れているでしょうか?

いくつかの追加のメモ:

  • 私たちは、「オンライン」ツールではなく、後処理用のスクリプトツールを主に探しています。そのため、Pythonを使用しています。

  • 上記のように、MDシミュレーションを行っています。関心のあるトピックの1つは拡散計算です。そのためには、アインシュタイン拡散係数を取得する必要があります これは、計算を開始する前にすべてのデータをメモリにロードする必要があることを意味します。すべてのデータの塊(個々の時間の記録)は互いに相互作用します。

    D=16リムtバツt+tバツt2

回答:


6

あなたの質問は、I / Oが分析全体にかなりのオーバーヘッドを引き起こすという観察から来ると思います。その場合、I / Oと計算をオーバーラップさせることができます。

成功するアプローチは、データへのアクセス方法と、そのデータに対して実行する計算に依存します。パターンを特定できる場合、またはデータのさまざまな領域へのアクセスが事前にわかっている場合は、「現在のチャンク」を処理しながら、バックグラウンドでデータの「次のチャンク」をプリフェッチすることができます。

簡単な例として、ファイルを1回だけ走査して各行または行セットを処理する場合、ストリームを複数の行(またはMB)に分割できます。次に、チャンクの各反復で、チャンクiの処理中にチャンクi + 1をロードできます。

状況はより複雑で、より複雑なソリューションが必要になる場合があります。いずれにせよ、プロセッサに処理するデータがある間にバックグラウンドでI / Oを実行するという考え方です。特定の問題に関する詳細を提供する場合は、詳細に調査できる場合があります;)

---- 詳細を提供した後の拡張バージョン ----

表記法が理解できるかどうかはわかりませんが、あなたが言ったように、アイデアは完全に相互作用です。また、データがRAMに収まる可能性があることにも言及します。次に、すべてのデータをロードする時間と計算を実行する時間を測定することから始めます。さて、

  • I / Oの割合が低い場合(0.5%、2%、5%など、オーバーヘッドを気にしない程度に低い場合)、単純なアプローチを使用します:データの読み込み一度に計算します。あなたの研究のより興味深い側面のための時間を節約できます。

  • オーバーヘッドの余裕がない場合は、Pedroが提案した内容を調べてください。Aron Ahmadiaが述べたことに留意し、完全な実装に進む前にテストしてください。

  • 前のものが満足できない場合は、いくつかのアウトオブコアの実装に行きます[1]。データ計算を実行しているように見えるので、希望があります:)疑似コード(解析結果がRAMに収まると仮定):n2n

    chunk1とchunk2をロードする
    チャンクi = 1〜n
        チャンクi + 1を非同期的にロードします
        j = i + 1 to nのチャンクの場合
            非同期的にチャンクj + 1をロードします
            チャンクi、jで計算します(*最初の反復では、これらはプリロードされたチャンク1と2 *です)

注:これは高速でダーティな擬似コードです。インデックスを調整する必要があります。

これを実装するには、いわゆるダブルバッファリングを使用するのが一般的です。大まかに言うと、メモリを2つのワークスペースに分割します。データがワークスペース1にバックグラウンドで読み込まれている間、プロセッサはワークスペース2のデータを使用して計算しています。各反復で、役割を交換します。

申し訳ありませんが、今すぐに良い参考文献を見つけることができません。

[1]アウトオブコアアルゴリズムには、ディスクにあるデータを(効率的に)処理するためのメカニズムが組み込まれています。インコア(「インRAM」)ではなく、アウトオブコアと呼ばれます。


7

私は以前にも同様の問題に対処しなければならなかったので、私のお気に入りの解決策はメモリマップドI / Oを使用することです。

その背後にある原理は非常に単純です。ファイルを開いてそこから読み取るのではなく、メモリに直接ロードし、巨大な配列であるかのようにアクセスします。それを効率的にするトリックは、オペレーティングシステムが実際にファイルをロードせず、ロードする必要があるスワップアウトされたメモリのようにそれを扱うだけであるということです。ファイル内の特定のバイトにアクセスすると、ファイルのその部分のメモリページがメモリにスワップされます。ファイルのさまざまな部分にアクセスし続けてメモリが不足すると、使用頻度の低い部分が自動的に交換されます!

簡単なGoogle検索で、これはPythonでも使用できることがわかりました:16.7。mmap —メモリマップファイルのサポートですが、Pythonが本当に同じものかどうかを判断するのに十分なPythonの知識はありません。


1
mmapメインコードに何かを実装する前に、必ず測定とテストを行ってください。多くの最新のオペレーティングシステムは、通常のシステムと同等のパフォーマンスを提供readし、複雑さを軽減します。(また、はい、PythonのmmapはWindowsおよびUNIXメモリマップへの移植可能なインターフェイスを提供します)。
アロンアーマディア

1

おそらく、ファイルI / OセクションでCythonを使用し、この部分をCコードに変換できますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.