一言で言えば、主な違いIMO:
- ボトルネックになる可能性があるもの (I/O または CPU) を事前に把握し、これに対処するための最適なアルゴリズムとインフラストラクチャに注目する必要があります。I/O がボトルネックになることがよくあります。
- アルゴリズムの選択と微調整は、多くの場合、他の選択よりも優先されます。
- アルゴリズムやアクセス パターンをわずかに変更するだけでも、パフォーマンスに桁違いの影響を与える可能性があります。多くのマイクロ最適化を行うことになります。「最良の」ソリューションはシステムに依存します。
- 同僚や他の科学者と話をして、これらのデータ セットに関する経験から利益を得てください。教科書には載っていないトリックがたくさんあります。
- 事前計算と保存は非常にうまくいく可能性があります。
帯域幅と I/O
最初は、帯域幅と I/O がボトルネックになることがよくあります。概観を示すと、 SATA 3の理論上の限界では、1 TB を読み取るのに約 30 分かかります。ランダムアクセス、数回の読み取りまたは書き込みが必要な場合は、ほとんどの場合これをメモリ内で行うか、かなり高速なものが必要です (例: InfiniBandを使用したiSCSI )。システムは、理想的には、使用しているインターフェースの理論上の限界にできるだけ近づけるために、並列 I/Oを実行できる必要があります。たとえば、異なるプロセスで異なるファイルに並列にアクセスしたり、 MPI-2 I/O の上でHDF5にアクセスしたりするだけです。はかなり一般的です。理想的には、2 つのうちの 1 つが「無料」になるように、計算と I/O も並行して実行します。
クラスター
ケースによっては、I/O または CPU のいずれかがボトルネックになる可能性があります。いずれにせよ、タスクを効果的に分散できれば、クラスターを使用して大幅なパフォーマンスの向上を実現できます (例: MapReduce )。これには、典型的な教科書の例とはまったく異なるアルゴリズムが必要になる場合があります。多くの場合、ここでの開発時間は最高の時間です。
アルゴリズム
アルゴリズムを選択する際には、アルゴリズムの大きな O が非常に重要ですが、同様の大きな O を持つアルゴリズムは、場所によってパフォーマンスが劇的に異なる可能性があります。アルゴリズムのローカル性が低いほど (つまり、キャッシュ ミスとメイン メモリ ミスが多い)、パフォーマンスが低下します。通常、ストレージへのアクセスは、メイン メモリよりも 1 桁遅くなります。改善の古典的な例は、行列の乗算またはループ交換のタイリングです。
コンピュータ、言語、専用ツール
ボトルネックが I/O である場合、これは、大規模なデータ セットのアルゴリズムが、より多くのメイン メモリ (64 ビットなど) またはメモリ消費量の少ないプログラミング言語/データ構造 (Python など) の恩恵を受けることができることを意味し__slots__
ます。 CPU 時間あたりの I/O が少なくなる可能性があります。ところで、TB のメイン メモリを搭載したシステムは前代未聞ではありません (たとえば、HP スーパードーム)。
同様に、ボトルネックが CPU である場合、より高速なマシン、言語、およびアーキテクチャの特別な機能 ( SSEのようなSIMDなど) を使用できるコンパイラを使用すると、パフォーマンスが桁違いに向上する可能性があります。
データを検索してアクセスし、メタ情報を保存する方法は、パフォーマンスにとって非常に重要です。多くの場合、フラット ファイルまたはドメイン固有の非標準パッケージを使用して、より効率的にデータにアクセスできるようにするデータを格納します (たとえば、リレーショナル データベースに直接ではありません)。たとえば、kdb+は大規模な時系列に特化したデータベースであり、ROOTはTTree
オブジェクトを使用してデータに効率的にアクセスします。あなたが言及したpyTablesは別の例です。