2

私はまだゲームに慣れていないPythonで開発しています。この問題に正しく取り組むようにしたいと思います。すべてのアドバイスを喜んで受け入れます。

多くの場合、合計サイズが 20 ~ 35 GB を超える、複数のフラット ファイルに保存されたデータを使用しようとすることを想像してみてください。最も一般的なケースでは、これらのファイルは区切られている (csv、タブ) か、単純に固定幅です。目標は、これらのファイル、または各ファイルの一部のサブセットを取得し、入力を解析し (各列はデータ内の変数を表します)、それを何らかの宛先 (ローカルまたはリモートの SQL、さまざまな種類の他のローカル ファイルなど) に送信することです。テキストまたは stata の .dta などの独自のデータ形式を含む出力形式の

目標は、利用可能なシステム リソースを使用して、この操作を可能な限り迅速に実行することです (1 秒あたりのキロバイト数で推測できますか?)。

質問:

  1. コンパイルされた C を使用して読み取り操作を行うと、効率が向上しますか? もしそうなら、どのライブラリの使い方を学ぶべきですか? また、解析と出力も c で行う必要がありますか?

  2. ファイルが .zip または .gz である場合、読み取りと書き込みの前にファイル全体を解凍する必要がありますか? それとも圧縮したままにして、圧縮ファイルから読み取ることができるライブラリを使用しますか?

  3. プログラムはマルチスレッドを使用する必要がありますか? ファイルのサブセット (たとえば、一度に n 行) を読み取り、たとえば j スレッドで解析して出力することを想像します。一度に 1 行ずつファイルを読み取るのが最適かどうかは明らかではありません...そして、スレッドとプロセスの最適な数は、利用可能なリソースとジョブのサイズに依存するようです。
    したがって、コードは、使用するスレッドの数と、各スレッドが実行する必要がある作業量を最適に判断できるほど「スマート」である必要があります。

  4. 異なる方法間の効率をどのように測定し、比較するのでしょうか?

  5. プログラムはこれを動的に実行し、パフォーマンスに基づいて入出力方法を選択できる必要がありますか? (方法 A は常に方法 B を厳密に支配するか、展開環境の特異な変更を行うか)

明確にするために、リソース効率の無視できない改善と引き換えに、コードの非効率性をほぼすべてのレベルで受け入れます。

これらの質問が、私が理解しようとしていることの明確なアイデアを提供してくれることを願っています。私のプログラミング経験はほとんどが科学的/統計的パッケージに限定されているため、私の質問のいずれかが「rtm」に要約される場合は、穏やかに適切なマニュアルを提案してください。

4

1 に答える 1

2

コンパイルされたCを使用して読み取り操作を実行することで効率が向上しますか?

あまり。制限はI/O帯域幅であり、Pythonは基盤となるCライブラリを使用します。

ファイルが.zipまたは.gzで提供されている場合、読み取りと書き込みの前にファイル全体を解凍する必要がありますか、それとも圧縮したままにして、圧縮ファイルから読み取ることができるライブラリを使用しますか?

まず、他のすべてをうまく機能させます。これを前もって精巧にしようとしないでください。PythonのZipFile実装は、ZIPアーカイブメンバーを展開せずに開くことで、CSV形式のファイルを処理できます。

これは速いですか?事前に知ることはできません。あなたはそれを構築し、あなたが構築したものを測定することによってのみ知ることができます。手を絞らないでください。ほんの数行のコードです。両方を構築します。

プログラムはマルチスレッドを使用する必要がありますか?

いいえ。

OSレベルのマルチプロセッシングを使用します。

python something.py source.zip | python part2.py | python part3.py | python part4.py >result

これは驚くほど高速で、多くの作業をしなくても、利用可能なすべてのOSリソースを使用します。

異なる方法間の効率をどのように測定して比較しますか?

うーん...それはばかげた質問です。あなたはそれを構築し、それを測定します。経過時間は他の何よりも良い尺度です。混乱している場合は、ストップウォッチを使用してください。真剣に。魔法はありません。

プログラムはこれを動的に実行し、パフォーマンスに基づいて入出力方法を選択できる必要がありますか?

いいえ。

(方法Aは常に方法Bを厳密に支配しますか、それとも展開環境の特異な変更を行いますか)

はい。はい。一部の方法は常により効率的です。ただし、OSは非常に複雑であるため、シンプルで柔軟なコンポーネント化された設計に代わるものはありません。

柔軟に再結合できるシンプルなピースを作成します。

事前に手で絞らないでください。可能な場合は、適切なデータ構造とアルゴリズムを設計してください。できない場合は、賢明なものを選んで先に進んでください。何かを構築して調整することは、細部をいじくり回して、それらが決して重要ではないことを見つけるよりもはるかに簡単です。

  1. 何かを構築します。

  2. 測定。

  3. ボトルネックを見つけます。

  4. 実証済みのボトルネックのみを最適化します。

于 2010-11-25T03:45:12.900 に答える