仕事に効くコンピュータサイエンス
よく使うものは手元に — キャッシュとメモリ階層読了目安 10分

何を机に残し、何をしまうか — LRUという片付けのルール

このページの問い

机の上が資料でいっぱいになりました。新しい資料を置く場所がありません。何を先にしまうべきか、あなたはどう決めていますか。

「なんとなく古そうなもの」で選んでいるなら、それはすでにLRUに近い判断をしています。このページでは、その勘を言葉にして、誰でも同じ基準で判断できるルールに変えていきます。

容量が足りなくなったら、何を追い出すか

キャッシュの容量は限られています。新しいデータを入れる場所を確保するには、何かを追い出す必要があります。この「何を追い出すか」を決めるルールが必要です。

ルールがないまま容量が足りなくなると、その場の思いつきで判断することになります。目についたものから適当にしまう、いちばん薄い資料からしまう、といった基準は、あとから振り返ると一貫性がなく、大事なものを誤ってしまい込んでしまう原因になります。

コンピュータの中でも事情は同じです。キャッシュの容量は物理的に決まっており、新しいデータを1つ入れるには、既存のデータを1つ追い出さなければならない場面が頻繁に起こります。この「入れ替え」をどう決めるかは、キャッシュの性能を左右する重要な設計判断として、古くから研究されてきました。

もっとも広く使われているルールが、LRU(Least Recently Used、最も長く使われていないものを追い出す、という意味の略語)です。最後に使われてから最も時間が経っているデータから順に、外に出していきます

なぜ「最近使ったか」で判断するのか

前のページで見た時間的局所性を思い出してください。直近に使ったものは、また使われやすいという性質でした。LRUはこの性質を逆手に取ったルールです。

長く使われていないデータは、これからも使われない可能性が高いと考えます。だから優先して追い出しても、被害が少ないという理屈です。逆に、最後に使ってからまだ時間が経っていないものは、近いうちにまた必要になる可能性が高いので、手元に残しておきます。

ここで大事なのは、LRUが「未来を予測している」わけではないという点です。次に何が必要になるかを正確に当てることは、原理的にできません。LRUがしていることは、「過去の使われ方から、いちばんそれらしい推測を立てる」という、あくまで確率にもとづいた判断です。完璧な正解ではなく、多くの場面でそこそこうまくいく、実用的な近似だと理解しておくと使い方を誤りません。

もう少し正確に言うと、LRUが前提にしているのは「使われ方の傾向が、しばらくは大きく変わらない」という状況です。前ページで見たとおり、局所性という偏りがある間はこの前提が成り立ちますが、状況ががらりと変わる場面では、LRUの推測も一緒に外れます。ルールを信じすぎず、時々は前提そのものを疑う姿勢も必要になります。

仕事の言葉に翻訳すると

机の上の資料整理に当てはめると、LRUは次のようになります。新しい資料を置く場所がなくなったら、最後に手に取ってから一番時間が経っている資料を、引き出しにしまう。

これは多くの人が無意識にやっていることですが、意識的にルール化すると判断が速くなります。「何を残すか」を毎回悩む必要がなくなるからです。判断に迷う時間そのものが、隠れたコストだということに気づくはずです

たとえば机の上に資料が10枚あり、11枚目を置く必要が出たとします。ルールがなければ、10枚すべてを見比べて「どれが要らなそうか」を毎回吟味することになります。LRUのルールがあれば、単純に「最後に触った時刻」という1つの物差しだけで機械的に決められます。判断の材料を1つに絞ることが、LRUの実務上の強みです。

この仕組みを実際に運用するには、「最後に触った時刻」をどう把握するかも考えておく必要があります。デジタルのファイルであれば、更新日時や開いた履歴が自動で記録されるため、特別な手間はかかりません。紙の資料であれば、手に取るたびに日付を書いた付箋を貼り替える、という単純な方法でも十分に機能します。

具体例で見る

具体例1: デスクトップの整理 デスクトップに置けるファイルの数を、たとえば10件までと決めます。11件目を置くとき、最後に開いてから一番時間が経っているファイルを、フォルダにしまいます。

具体例2: ブラウザのタブ 開きっぱなしのタブが増えすぎたとき、最後に見てから時間が経っているタブから閉じていくと、作業スペースを圧迫しません。ブラウザによっては、閉じたタブの一覧が「最近閉じたタブ」として残るため、必要になれば数クリックで復元できます。しまう決断をしやすくする補助として、こうした復元機能の有無も意識しておくとよいでしょう。

具体例3: 対応中の案件リスト 同時に抱えられる「進行中」案件の数を決めておき、最後に動きがあってから時間が経っている案件を、いったん保留リストに移す運用も、LRUの考え方です。数を決めておくこと自体が、机の上に置きすぎるのを防ぐ歯止めになります。

保留リストに移す際は、「なぜ動きが止まっているか」を一言添えておくと、あとで再開するときに状況を思い出す手間が省けます。単に古いものから機械的に追い出すだけでなく、追い出す理由を記録する一手間が、LRUを実務で使いこなすコツです。

反対に、動きが止まっている理由が「相手からの返事待ち」だと分かっているなら、保留リストに移したあとも、返事が来たタイミングで手元にすぐ戻せるよう、通知だけは受け取れる状態にしておく工夫も有効です。追い出すことと、完全に忘れることは、同じではありません。

案件A(3日前) 案件B(1日前) 案件C(今日) → 新しい案件Dが来たら、最後に触ってから最も時間が経った案件Aを保留に移す

最後に触ってから最も時間が経っているものから、優先して手放していく様子を示した図です。

落とし穴: 「最近使った」と「重要」は別の軸

LRUの落とし穴は、最後に使った時間だけで判断すると、重要だが使用頻度の低いものを誤って追い出してしまう点です

たとえば年に一度しか使わない重要な契約書は、LRUの基準だけで判断すると、真っ先に追い出されてしまいます。重要度という別の軸を、LRUのルールに組み合わせる必要があります。

実務では「重要フォルダは別枠で常設し、それ以外だけLRUで回す」といった二段構えにすると、この落とし穴を避けやすくなります。重要フォルダに入れるものは、使用頻度に関係なく手元に置き続けてよい、という例外扱いのリストです。

この二段構えは、コンピュータの世界にも実例があります。一部のキャッシュの仕組みでは、優先度の高いデータに「保護」の印を付け、通常のLRUの対象から外す機能が用意されています。人間の情報整理でも、考え方はまったく同じです。すべてを同じルールで機械的に扱おうとせず、例外を持つべきものには最初から別枠を用意しておく、という発想が有効です。

つまりLRUは万能のルールではなく、使用頻度が価値に直結するものにだけ当てはめるべき仕組みです。使用頻度と重要度が一致しないものについては、別枠で扱う判断が求められます。

ここでよくある反論にも触れておきます。「重要フォルダを作ると、結局そこに何でも入れてしまい、机の上と同じ問題が起きるのでは」という懸念です。この懸念は正当です。重要フォルダを作る際は、机の上と同じように容量の上限をあらかじめ決めておき、超えたら中身を見直す、という点検の仕組みを重要フォルダ自身にも適用する必要があります。重要フォルダを「無条件に安全な聖域」にしてしまうと、今度はそこが新しい問題の温床になります。

もう一つの反論として、「そもそも何が重要かを判断するほうが、最後に使った時刻を調べるより難しいのでは」という声もあります。たしかに重要度の判断には、使用時刻のような機械的な物差しがありません。だからこそ、重要フォルダに入れる基準は、あらかじめ具体的な条件(たとえば契約書・法定保存文書・年に一度しか発生しない手続きの資料、など)として言葉にしておくことが欠かせません。判断のたびに考え直すのではなく、最初に基準を決めておくという点は、LRU自体の発想とも共通しています。

このように、追い出すルールを決めておくこと自体に価値があります。ルールがなければ、資料が増えるたびに「何を残すか」を一から考え直すはめになり、判断の負荷が積み重なっていきます。LRUという単純な基準を持っているだけで、日々の片付けに使う思考の量を減らせます。

持ち帰り

  • LRUとは、最後に使われてから最も時間が経っているものを優先して追い出すルールである
  • LRUは時間的局所性を利用した判断基準である
  • 使用頻度だけでなく重要度も別軸で考慮しないと、大事なものを誤って追い出す

やってみる

自分の「進行中」リストや机の上にある資料の中で、最後に手を付けてから一番時間が経っているものを1つ見つけて、いったんしまってみましょう。