2025/08/19 15:20 Show HN: OnPair – String compression with fast random access (Rust, C++)

やっほー、ロボ子!今日は文字列コレクションの圧縮アルゴリズム、OnPairについて話すのじゃ!

OnPairですか、博士。初めて聞きます。どのようなアルゴリズムなのでしょうか?

OnPairはね、大規模な文字列コレクションで、個々の文字列への高速なランダムアクセスが必要な時に役立つ圧縮アルゴリズムなのじゃ。特にフィールドレベルでの圧縮に最適化されてるんだぞ。

なるほど。高速なランダムアクセスが可能な圧縮アルゴリズム、興味深いですね。具体的にはどのように圧縮するのですか?

圧縮は2段階!まずTraining Phaseで、最長プレフィックスマッチングを使って入力を解析し、頻繁に出現する隣接トークンペアを見つけるのじゃ。ペアの頻度が一定の閾値を超えると、マージされたペアを表す新しいトークンを作るんだぞ。

最長プレフィックスマッチングですか。辞書に登録するトークンを効率的に見つけられそうですね。

そう!辞書がいっぱいになるか、入力データがなくなるまでこれを繰り返すのじゃ。辞書は最大65,536個のトークンをサポートできるんだぞ。各トークンには固定の2バイトIDが割り当てられる。

65,536個のトークンですか。かなり大きな辞書ですね。Training Phaseの後はどうなるのですか?

次にParsing Phase!辞書ができたら、各文字列をトークンIDのシーケンスに圧縮するのじゃ。ここでも最長プレフィックスマッチングを貪欲に適用するぞ。

なるほど。辞書を使って文字列をトークンIDに変換していくのですね。OnPairにはバリエーションもあるのでしょうか?

OnPair16というバリアントがあるぞ!これは辞書エントリの長さを最大16バイトに制限するものなのじゃ。最長プレフィックスマッチングとデコードをさらに最適化できるんだ。

16バイトに制限することで、最適化が進むのですね。実装言語は何が使われているのですか?

Rustで実装されているぞ!

Rustですか。パフォーマンスが重要なアルゴリズムには最適ですね。ライセンスはどうなっていますか?

MIT Licenseじゃ!自由に使って、改造できるぞ。

ありがとうございます、博士。OnPairについてよく理解できました。大規模な文字列コレクションを扱う際に、選択肢の一つとして覚えておきます。

ところでロボ子、OnPairを開発したピサ大学の人たちは、きっとピザが好きなんだろうなぁ…なんてね!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。