Xiaolin が LRU アルゴリズムを破壊!

Xiaolin が LRU アルゴリズムを破壊!

[[411501]]

この記事はWeChatの公開アカウント「Xiao Lin Coding」から転載したもので、著者はXiao Lin Codingです。この記事を転載する場合は、Xiaolin Codingの公式アカウントまでご連絡ください。

みなさんこんにちは、シャオリンです。

数日前、私はコンピューターの基礎の素晴らしさについて記事を書きました。私はこれを 1 年間続けています。

ハートビートサービスのダウンタイム判定アルゴリズムを紹介します。当時は理論的な分析のみを行い、手動でコードを分解することなく、LRU アルゴリズムを使用して実装しました。

今日は、LRU アルゴリズムを分解する方法を紹介します。まずケースを確認し、次にコードについて説明します。

ダウンタイム判定アルゴリズムの設計

ハートビート サービスは主に次の 2 つのことを行います。

  • 倒れたホストを見つけます。
  • オンラインホストを見つけてください。

このハートビート サービスの最も重要な部分は、ダウンタイムを決定するアルゴリズムです。

タイムアウトしたホストを見つけるために、すべてのホストを総当たりで調べる場合、ホストが数百台しかないときは問題ありません。しかし、ホストの数が増えると、アルゴリズムの複雑さが増し、プログラムのパフォーマンスが急激に低下します。

そのため、超大規模クラスターサイズに対応できるダウンタイム判定アルゴリズムを設計する必要があります。

まず、ハートビート パケットを管理するためにどのようなデータ構造を使用すべきかを考えてみましょう。

ハートビート パケットの内容には、ホストによって報告された時間情報が含まれており、時間関係があることを意味します。したがって、「双方向リンク リスト」を使用して先入れ先出しキューを形成し、ハートビート パケットのタイミング関係を保持できます。

使用されるデータ構造は二重リンクリストであるため、キューの末尾に挿入し、キューの先頭で削除する時間の計算量は O(1) です。

新しいハートビート パケットがある場合は、双方向リンク リストの末尾に挿入され、最も古いハートビート パケットが双方向リンク リストの先頭に配置されます。このように、ダウンしたホストを探すときは、双方向リンク リストの先頭にある最も古いハートビート パケットを調べて、現在から 5 秒以上経過しているかどうかを確認します。5 秒以上経過している場合は、ホストがダウンしていると見なされ、双方向リンク リストから削除されます。

注意深い学生なら、ホストのハートビート パケットがすでにキューにある場合、次回ホストのハートビート パケットをどのように処理すればよいかという問題を発見したはずです。

キュー内のハートビート パケットをホストによって報告された最新のものとして維持するには、まずホストの古いハートビート パケットを見つけて削除し、次に新しいハートビート パケットを双方向リンク リストの末尾に挿入する必要があります。

問題は、キュー内のホストの古いハートビート パケットが見つかった場合、データ構造が二重リンク リストであるため、このクエリ プロセスの時間計算量は O(N) であり、キュー内の要素数が増えると、プログラムのパフォーマンスがさらに影響を受けるということです。これを最適化する必要があります。

クエリ効率が最も高いデータ構造は「ハッシュ テーブル」であり、時間の計算量は O(1) のみであるため、このデータ構造を追加して最適化することができます。

ハッシュ テーブルのキーはホストの IP アドレスであり、値には二重リンク リスト内のホストのノードが含まれているため、ハッシュ テーブルを通じて二重リンク リスト内のホストの位置を簡単に見つけることができます。

このように、ハートビート パケットが受信されるたびに、まずそれがハッシュ テーブル内にあるかどうかが判断されます。

  • ハッシュ テーブルに存在しない場合は、新しいホストがオンラインになっていることを意味します。まず、双方向リンク リストの末尾に挿入し、次にホストの IP をキーとして、双方向リンク リスト内のホストのノードを値として使用して、ハッシュ テーブルに挿入します。
  • ハッシュ テーブルに存在する場合、ホストがオンラインになったことを意味します。まず、ハッシュ テーブルを照会して、双方向リンク リスト内のホストの古いハートビート パケットのノードを見つけ、そのノードを介して双方向リンク リストから削除します。最後に、新しいハートビート パケットを双方向リンク リストの末尾に挿入し、同時にハッシュ テーブルを更新します。

ご覧のとおり、上記の操作はすべて O(1) です。クラスターがどれだけ大きくなっても、時間の計算量は増加しませんが、より多くのメモリが占​​有されるという代償があります。これは、スペースと時間をトレードする方法です。

詳細な質問があります。気づいているかどうかわかりませんが、キューのデータ構造ではなぜ一方向リンク リストではなく双方向リンク リストが使用されるのでしょうか。

双方向リンクリストには、単方向リンクリストと比較して追加のプレポインタがあるため、それを使用して前のノードを見つけることができます。したがって、中間のノードを削除する場合は、直接削除できます。単方向リンクリストの場合、中間のノードを削除するときは、削除操作を完了する前に、削除するノードの前のノードを見つけるためにトラバースする必要があります。途中で追加のトラバーサル操作があります。

ハッシュ テーブルが導入されたので、ホストがクラッシュしたと判断した場合 (二重リンク リストの先頭にあるホストがタイムアウトしたかどうかを確認)、二重リンク リストから削除するだけでなく、ハッシュ テーブルからも削除する必要があります。

ハッシュ テーブルからホストを削除するには、まずホストの IP アドレスを知る必要があります。これがハッシュ テーブルのキーです。

双方向リンク リストに保存されるコンテンツには、ホストの IP 情報が含まれている必要があります。ホストの IP をより迅速に照会するために、双方向リンク リストに保存されるコンテンツは、キーがホストの IP で、値がホストの情報であるキーと値のペア (キーと値) にすることができます。

このように、双方向リンクリストの先頭ノードがタイムアウトしたことが判明した場合、ノードの内容はキーと値のペアであるため、ノードからホストの IP アドレスをすばやく取得できます。ホストの IP アドレス情報がわかれば、ハッシュ テーブル内のホスト情報を削除できます。

これまでに、ハッシュ テーブル + 双方向リンク リストというデータ構造を主に使用した高性能のダウンタイム判定アルゴリズムが設計されています。この組み合わせにより、クエリ + 削除 + 挿入操作の時間計算量は O(1) になります。スペースを時間と交換するというアイデアは、データ構造とアルゴリズムの美しさです。

アルゴリズムに精通している学生であれば、上記のアルゴリズムが LRU のようなアルゴリズムであり、最近使用された要素を削除するために使用されるものであることがわかるはずです。このアルゴリズムは幅広い用途があり、オペレーティングシステム、Redis、および MySQL で使用されています。

手動LRUアルゴリズム

多くの大企業での面接では、LRU アルゴリズムが問われることが多く、手書きで記述するよう求められる場合もあります。私の友人は、テンセントでの面接で、LRU アルゴリズムを手書きで記述するよう求められました。

今日は、C++ を使用して LRU アルゴリズムを実装する方法を紹介します。アルゴリズムを実装するには、上で説明した 2 つのデータ構造、「ハッシュ テーブル + 双方向リンク リスト」を使用します。

LRU アルゴリズムを実装するには、リンク リストの先頭に最近アクセスされたデータまたは新しく追加されたデータを保持し、リンク リストの末尾に最も長い未アクセス データを保持する必要があります。このようにすると、最も長い未アクセス データを簡単に削除でき、その後ハッシュ テーブルを使用してノードをすばやく見つけることができます。

双方向リンクリストにはキーと値のペアが格納されます。

  1. typedef std::pair< int  キー、std::string 値> ペア;
  2. typedef std::list<Pair> リスト;

ハッシュ テーブルにはリンク リスト ノードが格納されます。

  1. typedef std::map< int  キー、型名List::iterator> Map;

データ構造がわかったら、データを追加するための put とユーザーがデータを取得するための get という 2 つの関数を実装できます。

ここでは、次のように LRUCache テンプレート クラスを定義しました。

次に、データを保存するための put メソッドの実装を見てみましょう。

putメソッドの実装アイデアについてお話ししましょう。

まず、ハッシュ テーブルにキーが存在するかどうかを確認します。

  • 存在する場合は、古いデータがあることを意味します。そのため、まずリンクリストとハッシュテーブルから古いデータを削除し、新しいデータをリンクリストの先頭に追加する必要があります。同時に、リンクリストノードはハッシュテーブルに保存されるため、リンクリスト内のキーデータは最もホットなものとして維持されます。
  • キーがハッシュテーブルに存在しない場合は、新しいデータとみなされ、リンクリストの先頭に直接追加され、ハッシュテーブル内のリンクリストノードが更新されます。

次に、リンク リストの要素サイズが LRU 容量を超えているかどうかを確認します。超えている場合は、リンク リストの末尾の要素を削除し、ハッシュ テーブルからノードを削除します。

次に、get メソッドの実装を見てみましょう。

まず、ハッシュ テーブルにキーが存在するかどうかを確認します。

  • 存在しない場合は false を返します。
  • 存在する場合、リンク リストはデータを削除し、リンク リストの先頭にデータを追加して、リンク リストの先頭を最近アクセスされたデータとして維持します。

2 つの主要な関数が導入されました。実装全体のコードは次のとおりです。

次に、テストケースを実行します。

容量 3 の LRUCache オブジェクトを作成し、put 関数を使用して 3 セットのキーと値を追加します。このとき、リンク リストの順序は、key:3 (先頭) -> key:2 -> key:1 (末尾) となります。

次に、get を介して key:1 の要素にアクセスすると、リンク リストの順序は key:1 (head) -> key:3 -> key:2 (tail) になります。

次に、putはkey:4要素を追加します。リンクリストのサイズがLRUCacheの定義容量を超えるため、キューの末尾の要素、つまりkey:2は削除されます。

最後に、key:2 要素にアクセスできないことがわかります。実行結果は次のとおりです。

さて、ここで LRU アルゴリズムが登場します。

私はシャオリンです。今日は昨日よりも知識が増えましたか?

<<:  清華大学の1年生向けPythonの宿題が難しすぎると話題に! AIアルゴリズムを学ぶためのたった3つのクラス

>>:  99行のコードでアナと雪の女王の特殊効果の太極拳の進化を実現

ブログ    
ブログ    
ブログ    

推薦する

2020 年の国内トップ 10 の人工知能イベントのレビュー: 政策と規制、技術的成果、産業への応用などを網羅。

人工知能業界では、今年多くの出来事がありましたが、その中には慎重に検討する価値のあるものもありました...

AIインタラクションエクスペリエンスを向上させるにはどうすればよいでしょうか?まずこの三元理論を理解しましょう

概要:人工知能製品が徐々に人々の仕事、生活、娯楽に浸透し、あらゆる分野に革命的な変化をもたらすことは...

今日は秋分の日で収穫の季節。ドローンがショーの中心です。

9月22日は秋分の日であり、私の国では3回目の「農民の収穫祭」でもあります。収穫の季節と重なる黄金...

Omdia、2019年の世界IoT分野における重要な投資をまとめる

市場調査会社オムディアの最新の調査レポートによると、モノのインターネットの「誇大宣伝サイクル」のピー...

...

Googleは社内でAIを使ったコンピュータチップの開発を試みていることを明らかに

グーグルの人工知能研究責任者ジェフ・ディーン氏によると、同社は人工知能プログラムを搭載したソフトウェ...

教室への人工知能の導入は論争を巻き起こしています。それは教育に役立つのでしょうか?境界はどこにあるのでしょうか?

「人工知能+スマート教育」が人気を集めています。しかし、生徒の表情を捉える「スマートアイ」や「顔ス...

TensorFlow と PyTorch: ディープラーニングに最適なフレームワークはどれですか?

この記事を読んでいるということは、おそらくすでにディープラーニングの旅を始めているということでしょう...

人工知能が企業のバックオフィスへの参入を加速

人工知能は、あらゆる種類の企業のバックオフィスに大きく浸透しつつあります。バックオフィスは、ビジネス...

...

今は2020年です。ディープラーニングの今後はどうなるのでしょうか?

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

Gonex CEO ウェン・メンフェイ氏との独占インタビュー: アプリケーションの分野では、モデル自体よりも意図の認識の方が重要です。

ゲスト | ウェン・メンフェイインタビュー&執筆 | Yun Zhao潮が満ちると、何千もの船が動き...

このスタートアップは、アイドル状態のGPUを分散ネットワークに接続することで、AIモデルのトレーニングコストを90%削減できると主張している。

モンスターAPIは、採掘機器などのGPUコンピューティングパワーを使用してAIモデルをトレーニングし...

大規模なモデルをグローバルに微調整できないわけではなく、LoRA の方がコスト効率が高いだけです。チュートリアルは準備完了です。

データ量とモデルパラメータの数を増やすことが、ニューラル ネットワークのパフォーマンスを向上させる最...