Oliverです。

障害が本当に出たのかアヤシイRAIDに負荷をかけまくるスクリプトを書いてて
きがついたんですが、少なくともLinux上ではRubyは32-bitプラットフォーム
で 2GB より大きいファイルが扱えません。
最初入ってた1.6.2だとglibc内から「File size exceeded」と言われて
Segmentation faultと同じ扱いでサヨウナラ。1.6.5だとErrno::EFBIGが
帰ってきました。

詳しいテストはまだ全然してないんですが、configure.inにAC_SYS_LARGEFILE
を追加することで、簡単な読み書きが出来る事が確認できましたが、まだ
いろいろ File クラスに不具合がありそうです。 1.7.2.0cvs2002.01.18で
実験しました。

例えば、File.seek の引数に 2147483647 より大きい数を与えると
-e:1:in `seek': bignum too big to convert into `int' (RangeError)
になったり、statのsizeフィールドが負だったりと、off_tの型が影響
を与える所で修正が必要な感じです。ほとんどは INT2NUM, LONG2NUMの
UINT2NUM, ULONG2NUMへの変更だと思われます。

もっと詳しく調べてみますが、これまでLarge File Supportがなかった
特別な理由とかあります?

ruby  -e 'File.open("tempfile2"){|f| f.seek( 2147483647 ); p f.read(20);}'
=> 問題なし。正しいファイル内容、だが f.pos => -2147483629

ruby -e 'File.open("tempfile2"){|f| f.seek( 2147483648); p f.read(20)}'
=> -e:1:in `seek': bignum too big to convert into `int' (RangeError)

$ls -l tempfile2
-rw-r--r--    1 bolzer   inst     2579447815 Feb 12 00:22 tempfile2

ruby  -e 'File.open("tempfile2"){|f| p f.lstat}'
#<File::Stat dev=2081, ino=31654663, mode=33188, nlink=1, uid=20751, gid=20000,
rdev=0, size=-1715519481, blksize=4096, blocks=5042920, atime=Tue .......


-- 
	Oliver M. Bolzer
	oliver / gol.com

GPG (PGP) Fingerprint = 621B 52F6 2AC1 36DB 8761  018F 8786 87AD EF50 D1FF