パフォーマンスガイド
DataStore は、多くの処理で pandas と比べて大幅なパフォーマンス向上を実現します。本ガイドでは、その理由とワークロードを最適化する方法について説明します。
DataStore が高速な理由
1. SQL プッシュダウン
処理はデータソース側にプッシュダウンされます。
2. カラムプルーニング
必要なカラムのみが読み込まれます。
3. 遅延評価
複数の処理が1つのクエリにまとめてコンパイルされます。
ベンチマーク:DataStore と pandas
テスト環境
- データ: 1,000万行
- ハードウェア: 一般的なノートPC
- ファイル形式: CSV
結果
| 操作 | pandas (ms) | DataStore (ms) | 優位 |
|---|---|---|---|
| GroupBy count | 347 | 17 | DataStore(19.93倍) |
| Combined ops | 1,535 | 234 | DataStore(6.56倍) |
| Complex pipeline | 2,047 | 380 | DataStore(5.39倍) |
| MultiFilter+Sort+Head | 1,963 | 366 | DataStore(5.36倍) |
| Filter+Sort+Head | 1,537 | 350 | DataStore(4.40倍) |
| Head/Limit | 166 | 45 | DataStore(3.69倍) |
| Ultra-complex (10+ ops) | 1,070 | 338 | DataStore(3.17倍) |
| GroupBy agg | 406 | 141 | DataStore(2.88倍) |
| Select+Filter+Sort | 1,217 | 443 | DataStore(2.75倍) |
| Filter+GroupBy+Sort | 466 | 184 | DataStore(2.53倍) |
| Filter+Select+Sort | 1,285 | 533 | DataStore(2.41倍) |
| Sort (single) | 1,742 | 1,197 | DataStore(1.45倍) |
| Filter (single) | 276 | 526 | 同程度 |
| Sort (multiple) | 947 | 1,477 | 同程度 |
重要なポイント
- GroupBy 処理: DataStore は最大 19.93 倍高速
- 複雑なパイプライン: DataStore は 5〜6 倍高速(SQL pushdown の効果)
- 単純なスライス処理: 性能は同程度で、差はごくわずか
- 最適なユースケース: groupby/aggregation を含むマルチステップ処理
- ゼロコピー:
to_df()ではデータ変換のオーバーヘッドなし
DataStore が有利になるケース
高負荷な集約処理
複雑なパイプライン
大容量ファイルの処理
複数カラムに対する操作
pandas が優位になりうる場合
ほとんどのシナリオにおいて、DataStore は pandas のパフォーマンスに匹敵するか、それを上回ります。ただし、次のような特定のケースでは pandas の方がわずかに高速な場合があります。
小規模データセット(1,000 行未満)
単純なスライス操作
カスタム Python Lambda 関数
DataStore が「遅い」ように見えるケースでも、パフォーマンスは通常 pandas と同等 であり、実用上の影響はほとんどありません。複雑な処理における DataStore の利点は、これらの例外的なケースを大きく上回ります。
実行をよりきめ細かく制御したい場合は、Execution Engine Configuration を参照してください。
ゼロコピー DataFrame 統合
DataStore は pandas の DataFrame を読み書きする際に ゼロコピー を利用します。これは次のことを意味します。
主なポイント:
to_df()は本質的にコストほぼゼロ ― シリアライズやメモリコピーは発生しない- pandas の DataFrame から DataStore を作成する処理は即時に完了する
- DataStore と pandas のビュー間でメモリが共有される
最適化のポイント
1. 高負荷なワークロード向けにパフォーマンスモードを有効化する
集約処理が主体で、pandas の出力フォーマット(行順、MultiIndex カラム、dtype の補正)が厳密に一致している必要がないワークロードでは、スループットを最大化するためにパフォーマンスモードを有効にします。
期待される改善効果: filter+groupby ワークロードで最大 2~8 倍高速化し、大規模な Parquet ファイルに対するメモリ使用量を削減します。
詳細については、Performance Mode を参照してください。
2. CSV ではなく Parquet を使用する
想定される改善効果: 読み取りが 3~10 倍高速化
3. 早い段階でフィルタする
4. 必要なカラムのみを選択
5. SQLの集約機能を活用する
6. クエリ全体の実行ではなく head() を使用する
7. バッチ処理
8. explain() を使用して最適化する
ワークロードのプロファイリング
プロファイリングを有効にする
ボトルネックを特定する
手法の比較
ベストプラクティスの概要
| プラクティス | 効果 |
|---|---|
| パフォーマンスモードを有効にする | 集約ワークロードが 2〜8 倍高速 |
| Parquet ファイルを使用する | 読み取りが 3〜10 倍高速 |
| 早期にフィルタリングする | データ処理量を削減 |
| 必要なカラムのみを選択する | I/O とメモリを削減 |
| GROUP BY/集約関数を使用する | 最大 20 倍高速 |
| バッチ処理を行う | 同じ処理の繰り返し実行を回避 |
| 最適化前にプロファイリングを行う | 実際のボトルネックを特定 |
| explain() を使用する | クエリ最適化を検証 |
| サンプルには head() を使用する | テーブル全体スキャンを回避 |
クイック判断ガイド
| ワークロード | 推奨 |
|---|---|
| GroupBy/集約 | DataStore を使用 |
| 複雑なマルチステップパイプライン | DataStore を使用 |
| フィルターを伴う大きなファイル | DataStore を使用 |
| 単純なスライス操作 | どちらでも可(性能は同程度) |
| カスタム Python lambda 関数 | pandas を使用するか、後段で変換する |
| ごく小さいデータ (<1,000 行) | どちらでも可(差はごくわずか) |
最適なエンジンを自動選択するには、config.set_execution_engine('auto')(デフォルト)を使用します。
集約ワークロードでスループットを最大化するには、config.use_performance_mode() を使用します。
詳細は Execution Engine および Performance Mode を参照してください。