Githubのオブジェクトカウントアルゴリズム

Githubのオブジェクトカウントアルゴリズム

Github を使用しているときに、次のプロンプトを見たことがありますか?

  1. $ gitクローンhttps://github.com/torvalds/linux  
  2. 「Linux」にクローンしています...
  3. リモート: オブジェクトをカウントしています: 4350078 、完了。
  4. リモート: オブジェクトの圧縮中: 100 % ( 4677 / 4677 )、完了。
  5. 受信オブジェクト: 4 % ( 191786 / 4350078 )、 78.19 MiB | 8.70 MiB/s

このプロンプトは、リモート コード リポジトリにクローン化する必要があるオブジェクトが合計 4350078 個あることを示しています。

これは「オブジェクトのカウント」と呼ばれます。Github は、クローン化する必要があるオブジェクトの総数をリアルタイムで計算する必要があります。

このプロセスは非常に遅いです。Github によると、Linux カーネルのような巨大なライブラリをインベントリするには 8 分かかります。つまり、 git cloneコマンドを発行した後、実際のデータ転送が開始されるまで 8 分間待機することになります。もちろんこれは耐えられないことだ。 Github チームはこの問題を解決しようと努めてきました。

その後、ついに新しいアルゴリズムが発見され、今では 1 回のカウントに 3 ミリ秒しかかかりません。

このアルゴリズムを理解するには、まず Git オブジェクトが何であるかを知っておく必要があります。簡単に言えば、オブジェクトはファイルであり、最も重要なオブジェクトの種類は 3 つあります。

  • スナップショットオブジェクト(コミット)

  • ディレクトリオブジェクト

  • ファイルオブジェクト

コードを送信するたびに、対応する現在の「ディレクトリ オブジェクト」の名前を含むコミット オブジェクトが生成されます。 「ディレクトリ オブジェクト」には、コード ルート ディレクトリに含まれるサブディレクトリとファイル情報が格納されます。各サブディレクトリは別の「ディレクトリ オブジェクト」であり、各ファイルは特定のファイル コンテンツを含む「ファイル オブジェクト」です。

したがって、「オブジェクトをカウントする」とは、さまざまなコミット、ディレクトリ、ファイルなどをカウントすることを意味します。 git clonegit fetch両方の操作では、どのオブジェクト ファイルがダウンロードされるかを知る必要があるため、オブジェクト インベントリが必要です。

オブジェクトをカウントするための元のアルゴリズムは次のとおりです。

  1. すべてのローカルブランチを一覧表示***コミット

  2. すべてのリモートブランチを一覧表示***コミット

  3. 2つを比較し、違いがあればブランチが変更されたことを意味します。

  4. 変更されたコミットごとに、変更されたサブディレクトリとファイルを確認します。

  5. 現在のコミットの親ノードまでトレースバックし、ローカルとリモートの履歴が一致するまで手順 4 を繰り返します。

  6. 変更が必要なすべてのオブジェクトを合計します

上記のプロセスは、「オブジェクト カウント」がファイル トラバーサル アルゴリズムであることを示しています。変更されたオブジェクトは 1 つずつカウントされるため、ファイル読み取り操作の回数が多くなります。大規模なコードベースでは、このプロセスは非常に遅くなります。

Github チームが考案した新しいアルゴリズムは、ビットマップ インデックスを作成すること、つまりコミットごとにバイナリ値を生成することです。

ローカル Github リポジトリの.git/objects/pack/ディレクトリを開くと、ビットマップであるインデックス ファイルとデータ ファイルが表示されます。簡単に言うと、これら 2 つのファイルは現在のコード ベース内のすべてのオブジェクトをインデックス化し、バイナリ値を使用してこれらのオブジェクトを表します。このバイナリ値には、オブジェクトの数と同じ数のビットが含まれます。 n 番目のビットは、データ ファイル内の n 番目のオブジェクトを表します。

各コミットには、現在のスナップショットに含まれるすべてのオブジェクトを表す対応するバイナリ値があります。これらのオブジェクトの対応するバイナリ ビットはすべて 1 で、他のバイナリ ビットはすべて 0 です。

これを実行する利点は、コミット オブジェクトを読み取る必要がないことです。現在のコミットに含まれるノードを知るには、バイナリ値を読み取るだけで済みます。さらに良いことに、2 つのバイナリ値に対して XOR 演算を実行するだけで、どのビット (つまりどのオブジェクト) が変更されたかがわかります。さらに、新しいオブジェクトは常に既存のバイナリ ビットの末尾に追加されるため、現在のコミットに前のコミットよりも多くのオブジェクトが含まれているかどうかを確認するには、追加ビットを読み取るだけで済みます。

このように、「オブジェクトのカウント」はバイナリ値の比較操作となるため、速度が非常に速くなります。詳しい説明については、公式ドキュメント「ビットマップの説明」および「ビットマップのフォーマット」を参照してください。

現在、このアルゴリズムは Github の実稼働環境に導入されており、ユーザーはオブジェクトのカウントを待つ必要がなくなりました。さらに、Github チームはこれを Git に統合しました。つまり、今後はすべての Git 実装で Bitmap 関数を使用できるようになり、将来的にはより興味深い使用法が確実に生まれるでしょう。

<<:  人工知能アルゴリズムを採用したGoogle検索は恐ろしい

>>:  教師なし学習アルゴリズム: 異常検出

推薦する

量産型マスターコントロールチップのネットワークセキュリティ設計

「サイバーセキュリティ」という用語は、ネットワークシステムにおけるハードウェア、ソフトウェア、データ...

ディープラーニングを使って夢に現れる物体を分析する

この記事の主な内容は機械学習と神経科学を組み合わせたものであり、読者にはこれら 2 つの方向に関する...

マイクロソフトがニュースルーム向けのAI支援プログラムを開始:ジャーナリストはAIを最大限に活用する方法を学ぶための無料コースを受講できる

マイクロソフトは2月6日、現地時間5日にプレスリリースを発行し、複数の報道機関と生成AIベースのコラ...

OpenAI、開発者向けGPTチャットボットAPIのメジャーアップデートを発表、価格を値下げ

OpenAI は本日、大規模言語モデル API (GPT-4 および gpt-3.5-turbo を...

モノのインターネットにおける人工知能の主要技術と手法

人工知能は、IoT の機能を実現する上で重要な役割を果たします。 AI と IoT の融合を推進し、...

モデルの過剰適合を防ぐにはどうすればよいですか?この記事では6つの重要な方法を紹介します

バフェット氏は「正確に間違っているよりも、おおよそ正しい方が良い」と述べています。機械学習では、過剰...

2026年までにIoT分野のAIサービス収益は36億ドルに達する

iottechnewsによると、IoT分野の人工知能(AI)と機械学習(ML)サービスは年間40%成...

ワンクリックで動画をアニメーションに変換できるAIツールが人気。様々な格闘技の動きをスムーズに変換でき、無料でオンラインでプレイできます。

テキスト、画像、ビデオ、すべてをアニメーション化できます。見てください、ほんの少し前まで二人の男が格...

...

システムアーキテクト、アルゴリズムエンジニア、人工知能エンジニアはどの程度の数学を学ぶ必要がありますか?

昨日、ネットユーザーから、数学オリンピックを勉強したことがないのにシステムアーキテクトになれるかと質...

顔認識に関する国家基準が策定中:顔のスキャンは許可されず、検証後にデータは削除される必要がある

近年、顔認識技術が急速に発展し、顔をスキャンするだけで高速鉄道駅に入ることができるので非常に便利です...

いくつかの小さな図でディープラーニングを徹底的に説明します

Andrew Ng 氏は、Tess Ferrandez 氏が修了したディープラーニング特別コースのイ...

AI が「長すぎて読めない」問題の解決を支援: 深層要約モデルの構築方法

過去数十年にわたり、私たちは情報に関する一連の根本的な変化と課題を経験してきました。今日、情報へのア...

ガートナー: 2019 年新興テクノロジー ハイプ サイクル

2019 年新興テクノロジー ハイプ サイクルでは、今後 5 ~ 10 年でビジネス、社会、人々の生...

コロナウイルスを分類する機械学習はわずか数分で完了

物理学者協会のウェブサイトが28日に伝えたところによると、カナダのコンピューター科学者と生物学者は、...