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

Ruan Yifeng: 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/秒

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

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

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

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

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

  • スナップショットオブジェクト(コミット)
  • ディレクトリオブジェクト
  • ファイルオブジェクト

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

したがって、「オブジェクトをカウントする」とは、さまざまなコミット、ディレクトリ、ファイルなどをカウントすることを意味します。 git clone と git 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 関数を使用できるようになり、将来的にはより興味深い使用法が確実に生まれるでしょう。

(以上)

<<:  8つのソートアルゴリズムのPython実装

>>:  Google、新しいオープンソース圧縮アルゴリズム Brotli を発表

ブログ    
ブログ    
ブログ    

推薦する

対照学習も次元の崩壊を引き起こすのでしょうか? LeCunとTian Yuandongのチームの新しい研究DirectCLRは、

[[431792]]自己教師学習はコンピューター ビジョンで広く使用されており、手動で注釈を付ける...

顔認識は優れているが、業界の自制心と法的監督が依然として必要である。

近年、顔認識をめぐる論争が絶えません。少し前に、「初の顔認識事件」の第一審判決が発表され、杭州野生動...

...

ChatGPTは、すべての過去のチャットの学習、記憶のリセット、および「読んだ後の書き込み」という新機能をテストするために公開されました。

ChatGPT は、大きな新機能をリリースしようとしている可能性があります。つまり、過去のチャット...

AIはどのようにして顧客の性格を判断できるのでしょうか?

AI を使用したソーシャル メディアの監視により、仕事、大学入学、賃貸住宅などを失う恐れがあり、本...

人工知能を客観的に見てみましょう。この記事では、AI が世界を変える 5 つの理由を紹介します。

人工知能 (AI) は、私たちがよく人工知能と呼んでいるものです。これは、コンピューター プログラム...

テクノロジー大手はAIの研究開発に数十億ドルを費やしているが、かつて人間に勝ったAIが売却されようとしているという自慢が疑問視されている

グーグルやフェイスブックなどのテクノロジー大手は長年にわたり、人工知能(AI)に数十億ドルを投資し、...

OpenAI の科学者による最新のスピーチ: GPT-4 は変曲点を超えようとしており、1000 倍のパフォーマンスが確実に出現します。

「GPT-4 は変曲点を超え、パフォーマンスの大幅な向上を達成しようとしています。」これは、Ope...

...

黄仁訓氏の予測: AGI は 5 年以内に実現される可能性があります。米国は中国のニーズを完全に満たして「サプライチェーンの独立」を達成するまでにまだ10年ある

最近、ニューヨークタイムズの年次ディールブックサミットで、黄仁勲氏は、汎用人工知能(AGI)を「かな...

GoogleはColab上のディープフェイクプロジェクトをひそかに禁止した

最近、GoogleがColaboratory(Colab)サービス上のディープフェイクプロジェクトを...

安全なパスワード保存の業界標準: bcrypt アルゴリズム

パスワードを安全に保護するための標準アルゴリズムである bcrypt アルゴリズムについて説明します...

今日のアルゴリズム: 文字列内の隣接する重複をすべて削除する

[[419471]]小文字で構成される文字列 S が与えられた場合、重複削除操作は隣接する 2 つの...

テンセントクラウドのフルリンクAI開発者サービスシステムがAIと産業の融合を加速

12月15日、第1回テンセントクラウド+コミュニティ開発者会議で、テンセントクラウドの副社長である王...

深センの無人バスの試験走行がWeChatモーメンツで話題に!

この日が来ることは誰もが知っていた!しかし、こんなに早く来るとは誰も予想していませんでした! 201...