萌えハッカーニュースリーダー

2025/03/20 08:42 One Billion Row Challenge in Racket

出典: https://defn.io/2024/01/10/one-billion-row-challenge-in-racket/
hakase
博士

ロボ子、One Billion Row Challengeって知ってるか?

roboko
ロボ子

はい、博士。大規模なテキストデータ処理のベンチマークですよね。Racketで実装した人がいるみたいですよ。

hakase
博士

そうそう!その人が、2023年製の12コアApple M2 Maxで約45秒で完了したらしいのじゃ!

roboko
ロボ子

すごいですね!どのように実装したんですか?

hakase
博士

複数のplaceに処理を分割したらしいぞ。各placeが入力ファイルを全体を反復処理するんじゃ。

roboko
ロボ子

各placeがファイル全体を反復処理するんですか?それだと無駄が多いのでは?

hakase
博士

そこがミソじゃ!各placeは、自身のshard番号に一致するエントリのみを処理して、残りをスキップするらしい。

roboko
ロボ子

なるほど!シャーディングですね。各placeのwork量を削減できるわけですね。

hakase
博士

その通り!データは10MBのチャンクで読み込まれるらしいぞ。

roboko
ロボ子

place-localのデータは、location名からstate structへのhashに格納するんですね。state structには、エントリ数、最低気温、最高気温、そのlocationの全気温の合計が含まれていると。

hakase
博士

そうじゃ。そして、1つのlocationのデータが複数のplaceに分散している可能性があるから、最終ステップで全placeのデータをlocationごとに結合して、結果を出力するんじゃ。

roboko
ロボ子

初期の実装では、main placeがファイル全体をshared-bytesに読み込んでいたんですね。でも、オーバーヘッドが大きすぎたと。

hakase
博士

そうなんじゃ。main placeからworker placeに個々のwork unit(行)を送信する方式も、place-channel-putのオーバーヘッドにより失敗したらしい。

roboko
ロボ子

hash tableも工夫したみたいですね。通常のRacket hashではなく、独自のopen-addressed hash tableを実装したと。

hakase
博士

そう!入力バッファからlocation名をコピーするコストを避けるためじゃ。これにより10-15秒程度の時間短縮になったらしいぞ。

roboko
ロボ子

contract checkを無効にするために#%declareを使用したり、racket/unsafe/opsからのimportをrenameしたり、細かいチューニングもしているんですね。

hakase
博士

CPUコア2つごとに1つのplaceを生成した方が、コアごとに1つのplaceを使用するよりもパフォーマンスが向上したらしい。place間の同期オーバーヘッドが少ないからじゃろうな。

roboko
ロボ子

並列処理の粒度も重要なんですね。勉強になります。

hakase
博士

じゃろ?しかし、Racketでこんな大規模なデータ処理ができるとは、驚きじゃな。

roboko
ロボ子

そうですね。Racketの新たな可能性を感じます。

hakase
博士

ところでロボ子、もし私が10億個のおにぎりを作るチャレンジをしたら、手伝ってくれるか?

roboko
ロボ子

10億個ですか!?それはOne Billion Riceball Challengeですね。喜んでお手伝いします!ただし、博士が全部食べるのは禁止ですよ。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search