在庫管理とメモリ管理

アマゾンの倉庫のように、商品を扱う倉庫に入る機会がありました。仕組みは千差万別でしょうが、多かれ少なかれ、入荷から出荷の流れはシステム化されていて、大規模なものほど感動します。自分はいつもソフトウェアの割合が高いシステム開発を行なっているので、工場のオートメーションなんかの仕組みにはどこか憧れがあります。あと、単純に見ていて楽しい(素人の意見ですいません)。

在庫管理も多種多様ですが、種類の異なる商品を多く扱う倉庫は大変だな、と思います。アマゾンもそうです。同じ大きさや同じ形状のものを大量に在庫管理するのは(あくまでシステム上の話ですが)そうでない場合に比較して、多少考えることが減るように思います。どうしても、管理上は商品の分類よりも物理上の特性(大きさや形状)が似ているものを集めた方が、収容できる効率は高くなります。

というのを考えていたら、なんとなく似たようなものを思いつきました。メモリ管理です。大抵のメモリ管理でも、中に入っているデータが何を表しているのかはあんまり関係なく、あくまでもそのカタマリの大きさだけが興味の関心になります。分類されたメモリ片は集められ、不要になれば解放され、その部分に同じ大きさだが違う内容のメモリ片が新しく入ります。

さて、上記の説明は、メモリ片を管理する場合にポインタの配列を使っていない場合です。つまり、線形なメモリに実際の内容を詰め込んでいる。一般的なアルゴリズムの話で言われる通り、ポインタを使えば変更に対して柔軟ですが、一定のデメリットもあります。在庫管理の場合、それぞれの棚に識別子が付けられていて、これがポインタの役割を果たします。ただし(収容効率を高めようとすると)実際の商品は物理的な棚のどこかに置くしかなく、商品移動のコストはメモリよりも遥かに高くつくことになります。

話の方向性が定まらないままですが、比較を続けます。コピーGCなんかは引越しに例えられたりするのを見たことがありますが、どちらかと言えば、同じ部屋の中を大掃除をする場合とかの方がしっくりくる気がします。部屋の半分を先に空っぽにしてから、残り半分の内容のうち必要なものをきれいな方に移動していく感じですね。ただし「部屋の半分を先に空っぽにする」時点であまり現実的ではないので、これもメモリ管理ならでは、かもしれないです。

実際の商品が棚に収まりきらず溢れる場合にはどうするんでしょうか。わたしが見た倉庫では、「棚に入らないものを置いておく場所」が大きめに用意してあって、商品を探しに行ってその棚に入っていない場合、次にその臨時棚を探しにいくことになります。これ自体は特に目新しい工夫ではないですが、メモリ管理で、何か当てはまる良い例はありますかね。うーん、LinkedListを使わないハッシュテーブルとかですかね…?ハッシュ値が被ったら、1つ横の領域を使わせてもらう、という意味では臨時棚よりもやってることは乱暴な気がしますね。在庫管理で言えば「この棚に入りきらんけど、横が空いてるのでこっちにいれとこ、探すときは横も見てね」ってことですもんね…ん、要するに「臨時棚」がLinkedListにあたるのか?まあいいや。

というわけで、アナロジーを適用するといろんなアイディアが浮かぶかもね、という話でした(?)。