From: Takahiro Kambe Date: 2001-02-04T01:24:26+09:00 Subject: [ruby-list:27472] Ruby への希望 (1): IO#sysseek こんばんは。 最近、UNIX上でファイルのバックアップ的な処理を行うスクリプトを、仕事の 方で初めてrubyを使って作成しました。そのときに感じたというか、欲しくなっ た機能をいくつか述べたいと思います。ほんとは、自分で実装までしたいとこ でもありますが、時間的な制約もありますので備忘録のつもりで書きます。 その1はIO#sysseekです。 UNIXのファイルシステムでは、論理的なサイズよりも使用しているディスクブ ロックが少ない、holeが存在するケースがあります。rubyのコードでは、 SIZE = 1024 * 1024 - 1 f = open("file", "w") f.seek(SIZE, IO::SEEK_SET) f.write("\n") f.close として作成できます。見掛け上は、 taca@edge[67]:ls -l file -rw-r--r-- 1 taca wheel 1048576 Feb 3 23:34 file といったサイズですが、実際に使用しているのは、 taca@edge[68]:du -sk file 16 file と16Kバイトしかありません。 この様なholeを持ったファイルを単純にコピーすると、不要なディスクブロッ クを使ってしまいます。read(2)したバイトがすべて '\0' のブロックは、 lseek(2)することでうまく処理できます。 rubyでは IO#read, IO#write, IO#seek を組み合わせることになります。一方 でファイルのコピーの処理は、適切なサイズで IO#sysread して IO#syswrite する方が、高速に行うことが期待できますが IO#sysseek はありません。この ため、IO#sysreadしといてIO#writeとIO#seekを使うといったあたりで妥協す ることになります。 IO#sysread と IO#syswrite の存在に対する対称性という意味も含めて、 IO#sysseek があった方が良いかと思います。 -- 神戸 隆博(かんべ たかひろ) at home