単一 i-node にまとめるの与太話2006年09月07日 15時36分01秒

アクセスが増えたと思っていたらようやく同じ事を考えてる人を見付けたから、結構飛んできているらしい。

思ったことは同じく、「やっと同じことをやった人を見つけた。」Ruby で書かれたディスク領域を圧縮したつもりになれるスクリプトgoogleFreeBSD ports を探した時には、削除するものはかなり見つけたのだがハードリンクはなかった。

かなり昔から考えてはいたが、実際に動作をするものを書いたのは、今回が最初。実は、最初は Ruby で試したのだが、あまりにも複雑になったため挫折した。始めて書く Ruby だったのも、失敗の大きな原因であろう。mput さんのスクリプトは、私が Ruby で書いたものと比べると、とても簡潔で読みやすい。

何度かあった容量危機は、ディスクの調整や移行、また別の方法でハードリンクへの置換をして、数年の間凌いできた。今回、またディスク利用率が 100% を越えたので、再開した経緯だ。

同じファイルがそこかしこに存在する場合にハードリンク作りすぎて EMLINK で失敗しちゃう可能性があるって事ですな。... EMLINK で失敗したらそれ以上はハードリンクしないような仕組みを入れたほうがいいと思います。
ハードリンクが溢れる件は知らなかった。これは、考慮する必要がある。FreeBSD の man errno には、こう出ていた。

     31 EMLINK Too many links.  Maximum allowable hard links to a single file
             has been exceeded (limit of 32767 hard links per file).


250 GB 以上のディスクで、一千万個のファイルを扱うのが目標なので、ファイルの比較やメモリの管理などは色々と最適化を順次やっているが、まだ目標には届いていない。

なお、私のプログラムの FreeBSD 版は、ファイルのサイズが同じで、ファイルの先頭と末尾の約 512 bytes が同一かつ、 md5、 sha1 と sha256 の全てが同じファイルが出来る可能性は、ゼロだと仮定している。__sun を付けると、sha1 と sha256 が使われなくなるので要注意だ。それゆえ、メモリの利用サイズが多少小さくなる。Solaris に sha が入っていないみたいだったからだが。

前回次回