みなさんこんにちは、カソンです。 React ソース コードは、さまざまなモジュールを実装するためにさまざまなアルゴリズムとデータ構造を使用します (たとえば、スケジューラは小さなトップ ヒープを使用します)。 本日は、データ キャッシュに関連する LRU アルゴリズムについてお話します。コンテンツには次の 4 つの側面が含まれます。
エントリーから実践までを網羅すると言ってもいいくらい、内容が盛りだくさん。気に入ってコレクションしてゆっくり消費するのがおすすめです。 すべてが始まった場所:サスペンスコンポーネント コードを分割するために、React 16.6 で Suspense と React.lazy が導入されました。 次のコードの場合:
パッケージング ツールでパッケージ化した後、以下が生成されます。 chunk.js (A、B、App コンポーネント コードが含まれています) 最初の画面レンダリングでは、コンポーネント B が不要な場合は、そのコードを分割できます。次の変更を加えるだけです:
パッケージング ツールでパッケージ化した後、以下が生成されます。
このように、最初の画面がレンダリングされるときに、B コンポーネントのコードが jsonp 形式でリクエストされ、リクエストが返された後にレンダリングされます。 B リクエストが返される前にプレースホルダーを表示するには、Suspense を使用する必要があります。
<div> の読み込み中。B リクエストが返される前にレンダリングされます。 .</div> をプレースホルダーとして使用します。 Suspense の役割は次のようになります。 非同期コンテンツが返される前にプレースホルダー(フォールバック属性)を表示し、返された後にコンテンツを表示する Suspense を使用した後にコンポーネントによって返される JSX 構造を見ると、非常に強力な詳細が見つかります。
この JSX からは、コンポーネント B が非同期にレンダリングされるかどうかを知る方法はありません。 同期と非同期の違いは次のとおりです。
Suspense は、ラップされたサブコンポーネントの中間状態ロジックを自分自身に収束させて処理できるため (つまり、Suspense のフォールバック プロパティ)、サブコンポーネントは同期と非同期を区別する必要がありません。 では、サスペンスの機能は、React.lazy (非同期リクエスト コンポーネント コード) からすべての非同期操作に拡張できるのでしょうか? 答えはイエスです。 リソースの偉大な成果React リポジトリは、複数のライブラリ (react、react-dom など) を含むモノレポです。その中には、Suspense と組み合わせたキャッシュ ライブラリ react-cache があります。その使い方を見てみましょう。 ユーザーデータを要求するメソッド fetchUser があるとします。
react-cache の createResource メソッドでラップすると、リソースになります。
リソースを Suspense と組み合わせて使用することで、非同期データ要求のロジックを同期的に記述できます。
ご覧のとおり、userResource.read は完全に同期的に書き込まれ、fetchUser は内部的に呼び出されます。 この背後にあるロジックは次のとおりです。
ステップ 1 と 5 から、1 つのリクエストに対して userResource.read が 2 回呼び出される可能性があることがわかります。
したがって、promise の値は userResource 内にキャッシュする必要があり、キャッシュ キーは userID です。
userID は User コンポーネントのプロパティであるため、User コンポーネントが異なる userID を受け取った場合、異なる userID に対応する promise を userResource 内にキャッシュする必要があります。 100 個のユーザー ID を切り替えると、100 個のプロミスがキャッシュされます。明らかに、キャッシュをクリーニングするアルゴリズムが必要です。そうしないと、キャッシュはオーバーフローするまでどんどん占有されてしまいます。 react-cache で使用されるキャッシュ クリーニング アルゴリズムは LRU アルゴリズムです。 LRU原則LRU(最近最も使われていない)アルゴリズムの中心的な考え方は次のとおりです。 データが最近アクセスされた場合、将来もアクセスされる可能性が高くなります。 したがって、頻繁に使用されるデータほど、その重みは高くなります。データを消去するときは、常に最も使用頻度の低いデータを消去してください。 react-cacheでのLRUの実装react-cache の実装は 2 つの部分で構成されます。
データアクセスcreateResource によって作成された各リソースには、対応するマップがあります。
userResource の例では、createResource は実行後にマップを作成します。
userResource.read が初めて実行されると、userID をキー、promise を値とするデータがマップに設定されます (エントリと呼ばれます)。
エントリーするには、次の 2 つのことを知っておく必要があります。
LRUアルゴリズムの実装react-cache は、「双方向循環リンク リスト」を使用して、挿入、更新、削除の 3 つの操作を含む LRU アルゴリズムを実装します。 挿入操作初めて userResource.read(userID) が実行されると、entry0 (略して n0) が取得され、それ自体と循環リンク リストを形成します。 このとき、first(最も高い重みを表す)はn0を指します。 userID プロパティを変更した後、userResource.read(userID) を実行して entry1 (略して n1) を取得します。 このとき、n0 と n1 は循環リンク リストを形成し、最初に n1 を指します。 n2を挿入すると、次のようになります。 新しいエントリが追加されるたびに、first は常にそのエントリを指していることがわかります。これは、新しいエントリが常に LRU で高い重みを持つという考えを暗示しています。 更新操作エントリがアクセスされるたびに、そのエントリは使用されているため、その重みは最高に更新されます。 次の n0 n1 n2 の場合、n2 の重みが最も高くなります (最初に n2 を指します)。 n1 に再度アクセスする場合、つまり次の関数が呼び出される場合:
n1に最も高い重みが与えられます。 削除操作キャッシュの数が設定された上限を超えると、 react-cache は重みの低いキャッシュをクリアします。 次の n0 n1 n2 の場合、n2 の重みが最も高くなります (最初に n2 を指します)。 最大キャッシュ制限が 1 の場合 (つまり、1 つのエントリのみがキャッシュされる場合)、キャッシュ数量が 1 に達するまで first.previous が繰り返しクリーンアップされます。 つまり、まずn0をクリーンアップします。 次にn1をクリーンアップします。 各クリーンアップの後、マップ内の対応するエントリが削除されます。 完全なLRU実装については、 react-cache LRU を参照してください。 要約するSuspense と組み合わせることができる React.lazy や react-cache 以外にも、React Server Component やストリーミング SSR など、想像力次第であらゆる非同期処理を Suspense に統合することができます。 年末までに基盤となるReact18が安定してくると、今後はこの同期開発モデルが徐々に主流になっていくのではないかと考えています。 将来 React がどれだけ多くの新しいガジェットを開発しても、基礎となるレイヤーは常にこれらの基本的なアルゴリズムとデータ構造になります。
本当に地味でつまらないです… |
<<: 教師あり学習に匹敵する、より優れた一般化性能を備えた自己教師あり学習深度推定アルゴリズム
>>: ガートナー:テクノロジープロバイダーの33%が2年以内にAIに100万ドル以上を投資する
日本は人間支援ロボットの規格策定に向け、国際標準化機構(ISO)と協議を行っている。ロボット工学に対...
コンピュータの問題解決のプロセスにおいて、データ構造とアルゴリズムはプログラムの 2 つの主要要素で...
2016年以来、人工知能は研究室から出て正式に人々の生活に入りました。これは人工知能技術の発展におけ...
人類の長い発展の過程において、生産性を向上させることができる発明や方法は、人々の記憶に残ります。産業...
物語の主人公は中国人のソフトウェアエンジニア、エリック・ユーです。 2016年、Google、Met...
2021年、国内の新エネルギー乗用車市場はチップ不足や電池原材料価格の高騰など予想外の事態に見舞わ...
12月5日、OpenAIは企業ユーザーの開拓に力を入れているものの、同社の幹部の一部は、この技術がす...
私たちはよく、「未来はどうなるのだろう?」と考えます。もっと正確に言えば、人類の未来はどのように発展...
報道によると、権威ある調査機関ガートナーは本日発表したホワイトペーパーで、投資家による人工知能(AI...
人類の進化の歴史を振り返ると、時代のあらゆる変化は不可逆的であることに気づくのは難しくありません。な...
コペルニクス気候変動サービスによると、2023年は記録上最も暖かい年となっただけでなく、世界の平均表...
丑年の最初の仕事週に、国家人工知能イノベーションおよび応用パイロットゾーンの数が増加しました。工業情...
人工知能、機械学習、マシンビジョンとは具体的に何でしょうか?顔認識と人工知能の関係は何でしょうか?人...