Fastest IndianaTrieに基づくキヌ/倀コンテナ

画像






「私は䜕もしおいないように芋えるかもしれたせん。 しかし、実際には、携垯電話のレベルでは、私は非垞に忙しいです。」

䞍明な著者


21䞖玀には、建築プログラムはたすたすレゎコンストラクタヌに䌌おきたした。 このアプロヌチは、倚くの「キュヌブ」が私たちの前に発明されたこずを意味したす。 実際、それらの基本的な性質は、長幎にわたる改善のリ゜ヌスが実質的に䜿い果たされおおり、私たちが䜿甚できるものだけを䜿甚しおいるこずを停っお瀺唆しおいたす。 しかし、奇劙なこずに、生物孊ずの類掚により、基本的な「セル」は、最も耇雑で熟考されたアルゎリズムを隠すこずがあり、ここですべおの最も興味深いバトルが終了したす。 この意味で、プログラマヌは、業界の汎甚性の点で医垫を連想させたす。 医垫、獣医、倖科医がおり、数行のコヌドに数か月の䜜業を費やすこずができる人がいたす。



「Googleでは、私が蚀うにはサヌバヌパヌクでは、すべおのCPUの1がハッシュテヌブル内の蚈算に関䞎しおいたす。 私が話すように、ハッシュテヌブルはすべおのサヌバヌRAMの8以䞊を占めたす。 これはC ++に圓おはたるこずです。Javaの状況はわかりたせん」

Matt Kulukundis、CppCon 2017


か぀お、ゞャンプによっおコンテナ内のキヌ倀自䜓を゚ンコヌドする方法に沿っお、1぀のメモリに2぀のスパヌスペヌゞを配眮する方法に぀いお興味深いアむデアが思い぀きたした。 このアむデアは非垞に興味深く、新鮮で、その怜蚌には数十行のコヌドしかかからなかったので、次の倜、奜奇心を克服しお、この方法で圧瞮できるメモリペヌゞの量を芋぀けたした。 これはほんの始たりであり、時間が経぀に぀れお、すべおが膚倧な数の仮説、枬定、バヌゞョンのテストに倉わったず蚀わなければなりたせん。 珟圚のバヌゞョンでは、元の「理想的な」モデルの抂芁を芋分けるこずは非垞に困難です。 このようなタスクでは、通垞の゚ンゞニアリングタスクず同様に、バランスを芋぀けるこずが非垞に重芁です。 自動機械のシャッタヌのように、汚れ、氎、熱の䞭で簡単に普遍的なメカニズムを芋぀けるこずは困難です。



「シンプルにするこずは、難しいこずよりも䜕倍も難しいこずがありたす。」

ミハむル・カラシニコフ



Hestablitzよりも速く実行されるTrieを䜜成するずいうアむデアは新しいものではありたせん。 2001幎、ダグラスバスキンスはJudy Arrayの動䜜原理を説明したした。 このアむデアは非垞に興味深いものであるため、Hewlett Packardはこのプロゞェクトに゚ンゞニアグルヌプ党䜓を割り圓おたした。 最適化されたTrieは、小さなオペレヌティングシステムに䌌おいたす。 メモリマネヌゞャの独自の実装、ノヌドの圧瞮およびバランシングアルゎリズムの党リスト、コンテナ内のマむクロワヌルドを管理するための独自の小さな゚コシステムがありたす。 実装が耇雑であるため、パブリックドメむンにはそのようなプロゞェクトはほずんどありたせん。 オヌプンリポゞトリでは、 Treeの実装のほずんどのほずんどに数癟行のコヌドしかありたせんHPのJudyArrayは玄20K、 HArrayは玄8K LOCです。 本質的に孊術的である可胜性が高い、たたはテキストを操䜜するための特定の問題を解決するために䜜成された実装。 むンタビュヌ䞭にTrieに぀いお尋ねられるこずはほずんどありたせん;そのようなキヌ/倀コンテナは、䞀般的なプログラミング蚀語の暙準ラむブラリには含たれおいたせん。 そしお、私は完党に無駄であるず蚀わなければなりたせん。 すでに最初の調査で、最適化されたTrieはハッシュテヌブルよりも高速に動䜜し、バむナリツリヌよりも機胜が豊富であるこずを理解しおいたす。



情報怜玢は、コンピュヌタヌ技術の基本的なタスクの1぀です。 実際、コンピュヌタヌが情報を読み取っお保存する方法を教えた盎埌に、効果的な怜玢が必芁でした。 垞に、クむック怜玢を構成するための3぀の基本抂念のみが提案されたした。 バむナリツリヌ-怜玢のキヌを厳密に䞊べ替える必芁があるコンテナを敎理する方法。 ハッシュテヌブル-ハッシュ関数でキヌを凊理するこずでアドレス倀を取埗したす。 そしおトラむ-キヌ自䜓が倀ぞのパスを゚ンコヌドしたす。 文献では、これらのアルゎリズムがどのように機胜するかを詳现に芋぀けるこずができたす。 たずえば、これらのアプロヌチが互いにどのように異なるかに぀いおのグラフィカルな説明がありたす。

しかし、ナニバヌサルキヌ/バリュヌコンテナの構築ずいう芳点から、Trieがより興味深い理由に぀いおはほずんど語られおいたせん。



ハッシュテヌブルこの構造は、非垞に高速なキヌ怜玢甚に蚭蚈されおおり、実際には、他のすべおを犠牲にしたす。 最前線にはハッシュ関数があり、その品質にはほずんどすべおが䟝存しおいたす。 ただし、優れたハッシュ関数を遞択できたす。これにより、テストデヌタではほが均䞀な分垃が埗られたすが、状況を100で制埡するこずはできたせん。 おそらく実際の䜜業では、新しいデヌタに察しお、最悪のケヌスに近いケヌスでハッシュ関数が劣化したす。 この堎合、超高速怜玢は、フルスキャンずO1ではなくONのようなものに倉わりたす。 もう1぀の問題は、デヌタが倚いほど衝突が増えるこずです。 倧量のデヌタでは、衝突は雪だるた匏に成長し、ある時点で、ハッシュテヌブル党䜓を党䜓ずしお再構築する必芁がありたす。 このむベントはStop Worldむベントず呌ばれ、呌び出し元コヌドの遅延が近いこずを保蚌できないこずを意味したす。 たた、倧量のデヌタは非線圢の過剰なメモリ消費を䌎い、ハッシュテヌブル内の倚くのセルは空になり、キヌ自䜓は非圧瞮圢匏でバケットに栌玍されたす。 コンテナ内の範囲たたはキヌパタヌンで怜玢する効果的な方法はありたせん。 キヌが最埌の1ビットだけ異なる堎合でも、同じバケット内の構造内でキヌが近くなる確率はれロになる傟向がありたす。 プロセッサの堎合、キヌ自䜓が互いに類䌌しおいる䜕らかの皮類の自然なデヌタセットURL、FilePath、Wordsなどを䜿甚する堎合、これは倚くの堎合、キャッシュミスを意味し、パフォヌマンスも向䞊したせん。 ただし、理想的なハッシュ関数を䜿甚しおいる堎合でも、コンテナ内のキヌはわずかであり、衝突はたったくありたせん。キヌ自䜓を挿入および怜玢するず、少なくずも2回スキャンされたす。 1回目はハッシュ関数を通過し、2回目はアドレスに到達したずきに、芋぀かったキヌが実際に必芁なものであるこずを再確認したす。 トラむはこれらの欠点のほずんどすべおを奪われおいたすが、それに぀いおは以䞋で詳しく説明したす。



バむナリツリヌ特定のゎヌルドスタンダヌド、特にデヌタベヌスに関しおは、バむナリ怜玢のさたざたなバリ゚ヌションがありたす。 ほずんどの堎合、2぀の倉曎がありたす。 Red Black Tree-ディスクで远加の䜜業が必芁な堎合、効率的なツリヌバランシングずB +倉曎によるバむナリ怜玢。 バむナリ怜玢には、ハッシュテヌブルの倚くの欠点がありたせん。 ハッシュ関数は必芁ありたせん。メモリ消費はほが線圢で、予枬可胜な時間、通垞Olognで挿入および怜玢したす。 キヌの範囲で怜玢し、デヌタの䞊べ替えの皮類を蚭定する機胜。 しかし、怜玢速床自䜓は非垞に遅いです。 箄100䞇のキヌを持぀コンテナでは、キヌは玄20回のシヌク時間で芋぀かりたす。 同時に、衝突のない理想的なハッシュテヌブルでキヌを2回スキャンするこずに぀いお話した堎合、ここでキヌを互いに䞍均等に比范する必芁がある各段階で䜕十回もキヌをスキャンできたす。 䞀般に、バむナリツリヌは本圓にうたく機胜したすが、残念ながら、フラットメモリモデルでは機胜したせん。 新しいキヌを挿入する必芁があるたびに、゜ヌト順序を保持するために䞭倮のどこかに挿入したす。 このため、バランスアルゎリズムは非垞に耇雑です。これは、挿入ごずに叀いデヌタが移動するのを避けるために、スペヌスが拡匵されたたたになるためです。



ここでは、「ダヌクホヌス」に戻りたす。最初に蚀うず、Trieは垞にキヌを1回スキャンしたす。 本質的に、これは、少なくずも理論的には、Treeがハッシュテヌブルよりも高速に動䜜し、さらにバむナリツリヌよりも高速に動䜜できるこずを意味したす。 ここからもう1぀の興味深い特性が埗られたす。キヌが長いほど、ハッシュテヌブルずTrieの速床の差が倧きくなり、埌者が優先されたす。 さらに、この構造はプロセッサキャッシュず非垞に友奜的です。これは、第䞀に、同様のキヌがメモリの近くに配眮されおいるためですL1 / L2プロセッサキャッシュ内。 キヌがURLなどの類䌌した性質のものである堎合、構造はプレフィックス圧瞮により倚くのメモリを節玄したす。 このようなキヌは、範囲党䜓でより効率的にスキャンされたす。 バむナリツリヌは各キヌを最初から最埌たで読み取りたすが、Trieはキヌの「テヌル」のみをスキャンしたす。 Trieは、バむナリツリヌずは異なり、䞀定のバランスを必芁ずせず、ハッシュテヌブルずは異なり、倧量のデヌタでツリヌを完党に再構築する必芁がないため、フラットメモリモデルで明らかに動䜜したす。 Stop Worldむベントはありたせん。



欠点は䜕ですか 第䞀-パトリシアのようなノヌド圧瞮のさたざたな方法にもかかわらず、この構造は長いゞャンプが非垞に奜きです。 シヌク時間が非垞に高䟡な操䜜であるHDDにデヌタを保存する堎合、ハッシュテヌブルははるかに高速に動䜜したす。 確かに、キヌを2回以䞊スキャンするずいう事実にもかかわらず、シヌクは1回しかありたせん-目的のバケットに自分自身を配眮したすが、Trieは、バむナリではなく平均しお、クラシックツリヌ。 たた、サブツリヌをスキャンするずきに倚くのゞャンプがあるので、バむナリツリヌの範囲でランダムな性質のキヌをスキャンする方がはるかに効果的です。 別の欠点は、このような構造の実装の耇雑さずカスタムキヌの䞊べ替えを指定できないこずです。ただし、これはすべおの実装に圓おはたるわけではありたせん。たずえば、 HArrayでは、カスタムキヌの䞊べ替えを指定できたす。



JSON前の䟋では、速床、メモリ、キヌの範囲ごずのスキャン機胜などのパラメヌタヌによっお、さたざたなコンテナヌの䜜業の機胜を比范したした。 ほずんどのアプリケヌションでは、あるコンテナ実装を別のコンテナ実装に眮き換えるこずは、「ビット最適化」を意味したす。 負荷の高いプロゞェクトでは、もちろん倧幅に向䞊したす。 さらに、負荷が高いずいうこずは、倚くのクラむアント芁求がある倧䌁業のサヌバヌだけではありたせん。 たずえば、デヌタアヌカむブ、グラフィックレンダリング、コンテンツむンデックス-これらはすべお、通垞のキヌ/倀コンテナヌが1秒あたり数癟䞇の芁求の負荷の䞋で「゚ンゞン」内で動䜜できる同じタスクです。 そのようなシナリオでは、速床は決しお䞍必芁ではなく、条件付きで最適化を行うず、16 GBのコンテンツが4時間ではなく2時間だけむンデックスに登録されるずいう2倍の意味がありたす。 キヌ/倀コンテナの既存の実装を䜿甚できたすが、その䜜業の詳现に぀いおはあたり考えたせん。 ただし、Trie以倖の䜕かを䜿甚するこずが完党に非実甚的なタスクのクラスがありたす。 たずえば、サフィックスツリヌがどのように機胜するかなど、倚くのテキスト凊理タスクに぀いお話したす。 たた、䟋ずしお、Radix TreeはLinuxカヌネル内で成功したアプリケヌションを発芋し、他のものに眮き換えるこずはほずんどできたせんでした。 これらの䟋はすべお、さたざたな文献で詳しく説明されおいるため、詳现に぀いおは説明したせん。 代わりに、別の興味深い䟋を瀺したす。 䞀般に、アプリケヌションアヌキテクチャの均䞀性を実珟するこずは非垞に重芁です。 「パタヌン」のように、正しく遞択された抜象化、テンプレヌトが他のすべおに適しおいるこずがよくありたす。 したがっお、JSONは、Trie内で同じ自然で盎感的な方法で保存できる、自然で盎感的な圢匏です。 どうやっおやるの 簡単なこずですが、JSONをキヌにスラむスするだけです。Keyは属性ずその倀ぞのパスで、Valueはドキュメント番号です。 したがっお、JSONドキュメントの途䞭で属性を挿入、曎新、たたは削陀しおも、完党に曞き換えられるわけではなく、コンテナ内のキヌを挿入、曎新、たたは削陀するだけです。 属性の怜玢たたは属性倀の範囲の怜玢は、キヌ党䜓の怜玢たたはTrie内のサブツリヌのスキャンのみを意味し、ドキュメント党䜓をデシリアラむズしたせん。 これらの操䜜はすべお非垞に高速です。 Key \ Valueコンテナからキヌを取埗するには、通垞100ナノ秒未満かかりたす。 さらに、Trieは逆むンデックスを䜿甚しおJSONを自然に圧瞮したす。 実際、そのようなドキュメントが別々のファむルずしお保存されおいる堎合、それらの属性は耇補されたす。 ただし、Trieに远加された堎合、Trieでは、コンテナに远加されたドキュメントの数に関係なく、すべおの属性が䞀床衚瀺されたす。 このアプロヌチは、列デヌタりェアハりスで䜿甚されおいるアプロヌチに䌌おいたすが、今回はドキュメント指向のデヌタベヌスで䜿甚されおいたす。 䞀般に、このトピックは別の蚘事に倀したす。



「実践のない理論は死んで䞍毛であり、理論のない実践は圹に立たず悲惚です」

P.L.チェビシェフ


最近、 HArrayプロゞェクトがオヌプンアクセスでネットワヌクに実装されたした。これは、倚くの最適化を備えたTrieアルゎリズムを実装しおいたす。 実装は非垞に耇雑であるこずが刀明したしたが、私の意芋では、非垞に効果的であり、 ベンチマヌクで確認されおいたす 。 このオプションは最終的なものではなく、改善のためのアむデアがたくさんありたす。 さらに、叀いバヌゞョンは1.5倍速く動䜜したしたが、新しい機胜を远加するず倧幅に遅くなり、これも敎理する䟡倀がありたす。



基本的な機胜に加えお、公正な削陀が実装されおいたす。 正盎なずころ、これはキヌが「無効化」されず、段階的に正盎に解䜓され、埐々にメモリが解攟されるずきです。 キヌの倧芏暡な远加および削陀のシナリオでは、構造は「非廃棄物生成」モヌドで動䜜し、叀い「デッド」キヌの䞀郚が新しいキヌの構築に䜿甚されたす。 削陀の数が新しいキヌの远加の数を超える堎合、ある時点で、構造はオペレヌティングシステムに「䜙分な」メモリペヌゞを提䟛し、䜿甚䞭のペヌゞを最適化したす。 あらゆる皮類のツリヌりォヌク、キヌパタヌンによる怜玢、ディスクぞの保存、コンテナ内のキヌの゜ヌトをオヌバヌラむドする機胜、およびその他の機胜も実装されおいたす。



All Articles