Dask on Ubuntu — Pandasの限界を超える並列データ処理の実践

データエンジニアリング

検証環境

本記事のコマンドはすべて docker run --rm ubuntu:24.04(2026-06-22 実測)で確認しています。VPS や WSL2 でも同じ手順で動作します。

Pandas でデータを扱っていると、いつかぶつかる壁があります。「数百万行のCSVを読み込んだらメモリが足りない」「groupby の処理が遅くて待ちきれない」という状況です。Dask はそのPandasの限界を、コードをほぼ変えずに突破できるライブラリです。

ただし「Dask を使えば何でも速くなる」は誤解です。実際に Ubuntu 24.04 の Docker コンテナで測ってみたところ、単純な groupby 集計はPandasの方が速く、Dask が速いのはパーティション単位の並列変換に限られました。この記事では実測数値を正直に載せながら、Dask が本当に効く場面を紹介します。

この記事のポイント

  • Ubuntu 24.04 に Dask をインストールする手順(PEP 668 対応済み)
  • 実測:map_partitions では Dask が 1.66倍速い。単純 groupby は Pandas が速い
  • Dask の本当の強みは「メモリに乗り切らない大規模データの out-of-core 処理」
  • Pandas コードを最小限の修正で Dask に移行する書き方

Dask とは何か

Dask は Python の並列計算ライブラリで、Pandas の DataFrame API をほぼそのまま使いながら、データを複数の「パーティション」に分割して処理できます。

最大の特徴は遅延評価(lazy evaluation)です。Dask のコードを書いただけでは何も実行されません。.compute() を呼んだ瞬間に初めてすべての処理がまとめて走ります。この仕組みにより、処理全体を最適化してから実行できます。

Dask遅延評価フロー(概念図)
Dask遅延評価フロー(概念図)

Pandas との違いを一言で言うと「全データを一度にメモリに展開しない」点です。100GB のCSVでも、パーティション単位で読んで処理するため、手元の 8GB RAM のマシンでも扱えます。

Ubuntu 24.04 へのインストール手順

手順1:Python 仮想環境を準備する

Ubuntu 24.04 では PEP 668 という仕様により、システムの Python に直接 pip install できなくなっています。最初に仮想環境(venv)を作るのが必須です。




ubuntu@server: ~
$ sudo apt update && sudo apt install -y python3 python3-venv
Setting up python3.12 (3.12.3-1ubuntu0.13) …
Setting up python3-venv (3.12.3-0ubuntu2.1) …
$ python3 -m venv ~/dask_env
$ source ~/dask_env/bin/activate
(dask_env) $

Ubuntu 22.04 の場合は apt install python3-pip を追加すれば、仮想環境なしでも pip3 install できます。ただし、将来を見越してvenvを使う習慣をつけておくと安全です。

手順2:Dask をインストールする




ubuntu@server: ~ (dask_env)
(dask_env) $ pip install ‘dask[dataframe]’
Collecting dask[dataframe]
Installing collected packages: click-8.4.1 cloudpickle-3.1.2
dask-2026.6.0 fsspec-2026.6.0 numpy-2.5.0
pandas-3.0.3 partd-1.4.2 pyarrow-24.0.0 toolz-1.1.0
Successfully installed dask-2026.6.0 pandas-3.0.3 numpy-2.5.0
(dask_env) $ python3 -c “import dask; print(dask.__version__)”
2026.6.0

dask[dataframe] と書くと Pandas・NumPy・PyArrow も一緒にインストールされます。依存関係を個別に管理する手間が省けて楽です。

Daskインストールログ(Ubuntu 24.04 実測)
Daskインストールログ(Ubuntu 24.04 実測)

手順3:バージョンを確認する




ubuntu@server: ~ (dask_env)
(dask_env) $ python3 -c “import dask, pandas, numpy; print(‘dask:’, dask.__version__); print(‘pandas:’, pandas.__version__); print(‘numpy:’, numpy.__version__)”
dask: 2026.6.0
pandas: 3.0.3
numpy: 2.5.0
Ubuntu 22.04 vs 24.04 バージョン比較表(実測)
Ubuntu 22.04 vs 24.04 バージョン比較表(実測)

Pandas コードを Dask に移行する

Dask の移行がしやすい理由は、API がほぼ Pandas と同じだからです。主な違いは2点だけです。

  • import pandas as pdimport dask.dataframe as dd
  • 結果を使う最後に .compute() を呼ぶ



Pandas vs Dask — コード比較
# — Pandas(従来)—
import pandas as pd
df = pd.read_csv(‘large_file.csv’)
result = df.groupby(‘category’)[‘amount’].sum()

# — Dask(変更点は3行だけ)—
import dask.dataframe as dd
ddf = dd.read_csv(‘large_file.csv’) # メモリに展開しない
result = ddf.groupby(‘category’)[‘amount’].sum().compute() # ← .compute() 追加

既存の Pandas コードを Dask に移すとき、ほとんどの場合は pd.dd. に変えて末尾に .compute() を追加するだけです。

Dask基本使い方(ubuntu:24.04 端末)
Dask基本使い方(ubuntu:24.04 端末)

実測:Dask は Pandas より本当に速いのか

Ubuntu 24.04 の Docker コンテナ(--cpus=4)で Dask 2026.6.0 と Pandas 3.0.3 を比較しました。結果は予想と違いました。

groupby 集計:Pandas の圧勝

5百万行の DataFrame に対して複数キーの groupby+agg を実行した結果:

処理 行数 pandas Dask(4 partitions)
groupby + agg(sum/mean/count) 500万行 0.152s 1.660s Pandas が 10.9倍速い
groupby + sum(単純) 1000万行 0.120s 0.404s Pandas が 3.4倍速い

正直、これは最初に測って驚きました。Dask のスケジューラがタスクグラフを構築・配布するオーバーヘッドが、実際の計算時間を大幅に上回ってしまいます。データが全部メモリに収まる場合、groupby の集計は Pandas の方が速いです。

map_partitions:Dask の逆転

パーティション単位の CPU バウンドな変換処理では、Dask が本領を発揮しました。

処理 行数 pandas apply dask map_partitions(8分割)
Z スコア正規化 + log変換 200万行 0.141s 0.085s Dask が 1.66倍速い

map_partitions は各パーティション(この場合は8分割)に同じ関数を並列で適用します。パーティション間に依存関係がない変換処理では、CPUコアを有効に使えます。

map_partitions実測コード(1.66倍速)
map_partitions実測コード(1.66倍速)
Dask vs Pandas 処理時間比較(実測)
Dask vs Pandas 処理時間比較(実測)
ベンチマーク結果サマリ(実測)
ベンチマーク結果サマリ(実測)

Dask が本当に効く3つの場面

①メモリに乗り切らない大規模CSV

Dask の最大の強みは out-of-core 処理です。100GB のCSVを Pandas で読もうとするとメモリ不足でクラッシュしますが、Dask なら dd.read_csv('*.csv') とするだけで複数ファイルをパーティション単位で読み込めます。




大規模CSV 処理の例
# 複数CSVをまとめて処理(メモリに展開しない)
ddf = dd.read_csv(‘/data/logs/*.csv’, dtype={‘user_id’: ‘int32’})
result = ddf.groupby(‘user_id’)[‘revenue’].sum().compute()
# ↑ パーティション単位で読みながら集計。100GBでも OK

②パイプラインの構築と遅延実行

前処理 → 特徴量生成 → 集計 という一連の処理を Dask で書くと、.compute() を呼ぶまで何も実行されません。途中で「この処理はいらなかった」と気づいて削除しても、実行コストがかかっていないため無駄がありません。




遅延評価パイプライン
ddf = dd.read_csv(‘sales.csv’)
# ここまで何も実行されない
ddf = ddf[ddf[‘amount’] > 0]
ddf[‘tax’] = ddf[‘amount’] * 0.1
result = ddf.groupby(‘region’)[‘tax’].sum()
# .compute() で全処理をまとめて最適化して実行
output = result.compute()

③map_partitions での並列変換

カスタム関数をパーティションごとに並列で適用する場合、複数CPUコアを使えます。実測では 8パーティション・4CPU のとき 1.66倍速でした。

注意

Dask のデフォルトスケジューラはスレッド(synchronous または threads)を使います。Python の GIL により、純粋な CPU 計算は並列化されにくいです。本当にCPU並列が必要なら dask.distributed でローカルクラスターを立てるか、NumPy / Numba と組み合わせる必要があります。

よくあるエラーと解決策

① PEP 668 エラー(Ubuntu 24.04)




エラー例
error: externally-managed-environment
× This environment is externally managed
hint: See PEP 668 for the detailed specification.

Ubuntu 24.04 のシステム Python は PEP 668 でガードされています。python3 -m venv ~/dask_env && source ~/dask_env/bin/activate で仮想環境を作ってから pip install してください。

② .compute() を忘れてオブジェクトが返る




よくある間違い
result = ddf.groupby(‘cat’)[‘amount’].sum()
type(result) → <class ‘dask.dataframe.core.Series’>
# ← pandas の Series じゃない。.compute() が必要
result = ddf.groupby(‘cat’)[‘amount’].sum().compute()
type(result) → <class ‘pandas.core.series.Series’>

Dask の処理はすべて「予約」状態なので、結果を使いたいときは必ず .compute() を追加します。

③ メモリ使用量が Pandas より増える

実測では 5百万行の groupby で Dask のピークメモリが Pandas(229 MB)より Dask(383 MB)の方が大きくなりました。タスクグラフの管理と中間結果の保持にオーバーヘッドがあります。データがメモリに収まるサイズなら、Dask のメリットは薄いです。

Ubuntu 22.04 vs 24.04 の違い

同じ Dask 2026.6.0 でも、Ubuntu のバージョンによって Python と依存パッケージのバージョンが変わります。

項目 Ubuntu 22.04 (Jammy) Ubuntu 24.04 (Noble)
Python 3.10.12 3.12.3
pandas(pip 最新) 2.3.3 3.0.3
numpy(pip 最新) 2.2.6 2.5.0
pip install の方法 pip3 で直接 OK venv が必須(PEP 668)

Ubuntu 24.04 を使う場合は、最初から venv を作る癖をつけておくと後でつまずかなくて済みます。

まとめ

Dask on Ubuntu の実測をまとめると:

  • インストールは python3 -m venv + pip install 'dask[dataframe]' の2ステップ(Ubuntu 24.04)
  • 単純な groupby 集計では Pandas の方が速い(スケジューラオーバーヘッドが支配的)
  • map_partitions による並列変換は Dask が 1.66倍速い(実測、4CPU・8パーティション)
  • Dask の本領は「メモリに乗り切らない大規模データの out-of-core 処理」と「遅延評価パイプライン」

手元のデータが数百MB 程度なら Pandas で十分です。GB 単位になってきたとき、または複数の大きなCSVをまとめて処理したいときに Dask を試してみてください。移行コストは想像より小さいはずです。

本格的にサーバーでデータ処理を動かすなら、VPS の選び方も重要です。メモリが多いほど Pandas でもできることが広がり、CPU コア数が多いほど Dask の並列処理が効きます。

Ubuntu に Docker をインストールする手順はこちら

コメント

タイトルとURLをコピーしました