2009年3月25日水曜日

関数型ファイルシステム

大規模ストレージに巨大ファイルを格納するようになると、簡単にクライアント・サーバ間でファイル転送するわけにはいかなくなる。その結果、クラウドのようにサーバ側で処理することが多くなってくる。このとき、クラウドならなおのことサーバ側で割り当てられる資源は予測できない。つまり、多くの資源を割り当てられ速く計算されるか、少ない資源を割り当てられ遅く計算されるか、あらかじめ知ることはできない。そこで、たとえ少ししか資源が割り当てられない場合でも、処理の遅延を隠蔽することが重要になる。つまり、本当に計算することなく、掲載したつもりで応答してしまう。
このような場合に有効な考えが関数型ファイルシステムだろう。関数型ファイルシステムとは、この記事で使用する造語なので、世間一般的に通用しないかもしれない。しかし、関数型プログラミングとファイルシステムを合わせたものと考えると、容易に理解できるだろう。
関数型プログラミングでは、一般的に副作用がない。その結果、遅延評価(本当に必要とされるまで実際の計算を遅らせること)が可能となる。これをファイルシステムに応用すると、例えば、ファイルoriginalFileをコピーするとき、コピー先はcopied(originalFile)という値にしておく。これはまだ本当にコピーされたわけではなく、アプリケーションがそのファイルを使用するとき、元のファイルoriginalFileから読み込むことを意味する。
このままでもある程度有効なのだが、パイプライン処理を工夫することでさらに効率よくできる。具体的にはパイプラインに対してシークできるとよい。処理によっては変換前後でサイズが変わらないこともある。このような処理はまれだが、より一般的にはあるブロックが別の長さのブロックに変わることがある。ポイントは異なるブロックで情報が独立していることだ。このような場合、ある程度途中のブロックをスキップできる。圧縮のように前後のブロックに依存関係がある場合、このような処理に属さない。

0 件のコメント: