pymizuがタスク往復を100µsから1µs未満に短縮、PythonとRをゼロコピーで並列化

Mizu – zero-copy parallel R and Python over shared memory

pymizuはPOSIX共有メモリ上にロックフリーのリングバッファとワークスティーリング型タスクプールを構築し、プロセス間通信の往復を約0.7µsまで縮める。ProcessPoolExecutor比で135倍、ThreadPoolExecutor比でも14倍高速。numpy配列やArrowテーブルをゼロコピーで共有でき、同じコアを束縛したRパッケージmizuと組み合わせればPythonとRが相互にデータをやり取りできる。concurrent.futures互換のExecutorやasyncio連携、再現可能な並列乱数も備える。

タスクの往復がソケット経由の約100µsから1µs未満に短縮されるため、スレッドを使うときと同じくらい細かく作業を分割できる。
  1. stdbrouw

    すごい。昨年miraiを使っていて、インメモリのArrowテーブルへの共有アクセスを提供できないと知ったときは本当にがっかりしたのを覚えている。Rでのマルチコア処理はうまく動くときは素晴らしいけれど、望まない不要なデータコピーがあっという間にパフォーマンスを完全に破壊してしまうのは、あまりに頻繁に起きる話だ。

  2. shikokuchuo

    作者です。私はmizu(R)とpymizu(Python)を書きました。これらは同じCコアであるlibmizu上に構築された、共有メモリ上でのロックフリーな非同期・並列コンピューティングを提供するパッケージです。上のリンクはPythonパッケージのものです。

    タスクの往復は、PythonのProcessPoolExecutorや私のもう一つのRフレームワークであるmiraiでソケット越しに約100µsかかっていたのが、1マイクロ秒未満にまで短縮されます。これは私のラップトップ(M4 Pro)での数値で、ベンチマークスクリプトはリポジトリに入っているのでぜひ実行してみてください。

    ワーカーはロックフリーのキューからタスクを取り出し、タスクディスパッチャは存在せず、ホットパス上ではシステムコールを避けています。

    `PoolExecutor`は`concurrent.futures.Executor`のドロップイン置き換えで、タスクはasyncioでawait可能、NumPy配列やpolars、pyarrow、pandasのフレームはゼロコピーのビューとして受け渡されます。mizuとpymizuは同じワイヤーフォーマットを共有しているため、データフレームやArrow型は異なる言語のワーカープール間でもゼロコピーで受け渡されます。

    もちろん、共有メモリを使うため単一マシン限定です。APIはまだ実験的です。使い勝手に関するフィードバックやバグ報告はリポジトリで大歓迎です。どんな場面で使いたいかもぜひ聞かせてください。

    完全なベンチマークとR/Pythonのコード例を交えた解説記事:https://opensource.posit.co/blog/2026-11-05_mizu-0-1-0/

この日のほかの記事

2026-11-08