4

私は長時間実行されているPythonプログラムに取り組んでいます(その一部はFlask APIであり、他のリアルタイムデータフェッチャーです)。

私の長時間実行プロセスは両方とも、大規模なデータセット(たとえば、1〜5 MB相当のデータなど、特定の経済系列の1秒ごとの観測)に対して非常に頻繁に繰り返されます(APIは1秒間に数百回も実行する場合があります)。また、シリーズ間の補間、比較、計算も行います。

プロセスを存続させるために、これらの大きなデータセットを反復/パラメーターとして渡す/処理するときにどのようなテクニックを練習できますか?たとえば、gcモジュールを使用して手動で収集する必要がありますか?

アップデート

私はもともとC/C ++開発者であり、C ++でパーツを書くのに問題はありません(そして楽しむことさえできます)。私は単にそうする経験がありません。どうすれば始められますか?

何かアドバイスをいただければ幸いです。ありがとう!

4

2 に答える 2

1

大規模なデータセットを操作しても、必ずしもメモリが複雑になるとは限りません。データを表示および操作するときに健全なアプローチを使用している限り、通常はメモリを節約できます。

データを処理するモデルを構築する際には、2 つの概念を考慮する必要があります。

  1. 特定の計算を実行するためにアクセスする必要があるデータの最小要素は何ですか? たとえば、数字で満たされた 300GB のテキスト ファイルがあるとします。数値の平均を計算する場合は、一度に 1 つの数値を読み取って移動平均を計算します。この例では、最小の要素はファイル内の単一の数値です。これは、任意の時点で考慮する必要があるデータ セットの唯一の要素であるためです。

  2. 計算中にこれらの要素に 1 つずつ繰り返しアクセスするようにアプリケーションをモデル化するにはどうすればよいでしょうか? この例では、ファイル全体を一度に読み取るのではなく、ファイルから一度に 1 つの数値を読み取ります。このアプローチでは、少量のメモリを使用しますが、任意に大きなデータ セットを処理できます。データセットへの参照をメモリ内で渡す代わりに、データセットのビューを渡します。ビューは、データセットから特定の要素をオンデマンドでロードする方法を知っています (一度作業すると解放できます)。これは原則としてバッファリングに似ており、多くの反復子が採用するアプローチです (たとえば、xrangeopenファイル オブジェクトなど)。

一般に、コツは、問題を小さな一定サイズの断片に分割する方法を理解し、それらの断片を 1 つずつつなぎ合わせて結果を計算することです。これらのデータ処理のテナントは、大規模な並列処理をサポートするアプリケーションの構築と密接に関連していることがわかります。

向かってgcいるのは銃をジャンプすることです。取り組んでいることの高レベルの説明しか提供していませんが、あなたが言ったことから、メモリ管理をいじって物事を複雑にする必要がある理由はまだありません。実行している分析の種類に応じて、numpy重い統計分析の負担を軽減することを目的とした調査を検討してください。

于 2012-06-05T05:24:56.890 に答える
0

データ/アルゴリズムを実際に調べずに言うのは難しいですが、次のアプローチは普遍的なようです:

  1. メモリリークがないことを確認してください。そうしないと、遅かれ早かれプログラムが強制終了されます。objgraphを使用してください - 素晴らしいツールです! ドキュメントを読んでください - Python プログラムで直面する可能性のあるメモリ リークのタイプの良い例が含まれています。

  2. 可能な限り、データのコピーは避けてください。たとえば、文字列の一部を操作したり、文字列の変換を行う必要がある場合は、一時的な部分文字列を作成しないでください。インデックスを使用し、できるだけ長く読み取り専用のままにしてください。コードがより複雑になり、「pythonic」が少なくなる可能性がありますが、これは最適化のコストです。

  3. gc は慎重に使用してください。しばらくの間無責任な処理が行われると同時に、価値がなくなる可能性があります。ドキュメントを読んでください。簡単に言うと、Python インタープリターが整数の大きな一時リストを割り当てた後にメモリを解放できないなど、実際にそうする理由がある場合にのみ、gc を直接使用する必要があります。

  4. C++ の重要な部分を書き直すことを真剣に検討してください。データが大きくなったときに備えて、この不快なアイデアについて今すぐ考え始めてください。まじめな話、だいたいこんな感じで終わります。Cythonを試すこともできます。これにより、反復自体が高速化される可能性があります。

于 2012-06-05T04:59:29.023 に答える