[ruby-list:39025] Re: 2GB を超えるファイルのサイズ
From:
Takashi Seki <hawk.seki@...>
Date:
2004-01-06 03:52:19 UTC
List:
ruby-list #39025
関 隆です。
ありがとうございます。
おっしゃるとおり、cygwin版にしたところ、
ファイルサイズは正常に取得できました。
しかし、cygwin版でも IO.pos に似たような制限があるようです。
2GB以降にseek 後 pos を実行した時点で落ちます。
以下に再現用のスクリプト、出力、スタックトレースを示します。
io.c を見る限りではここでも off_t 型が使われているようです・・・
が、現状の私の能力ではここまでが限界でした・・(;o;)
ちなみに、linux(RH7.1 + ruby1.8.1) ではまったく問題なく正常に動作しました。
ので、こっちで作業を進めることにしました。
以上です。
----- ここから
filename = '/cygdrive/g/largeFile' # filesize = 2367467268
largeFile = File.open(filename)
fileSize = File::size(filename)
puts "fileSize = #{fileSize}"
seekPoint = 2147483647
puts "seekPoint = #{seekPoint}"
largeFile.seek(seekPoint)
filePos = largeFile.pos
puts "filePos = #{filePos}"
seekPoint += 1
puts "seekPoint = #{seekPoint}"
largeFile.seek(seekPoint)
filePos = largeFile.pos #[BUG]???
puts "filePos = #{filePos}"
=begin
> ruby seekTest.rb
fileSize = 2367467268
seekPoint = 2147483647
filePos = 2147483647
seekPoint = 2147483648
seektest.rb:18: [BUG] rb_sys_fail(/cygdrive/g/largeFile) - errno == 0
ruby 1.8.1 (2003-12-25) [i386-cygwin]
4 [sig] ruby 1156 open_stackdumpfile: Dumping stack trace to ruby.exe.stackdump
Stack trace:
Frame Function Args
0249E5E8 77E5B3D5 (00000330, 00000001, 00000000, 61079788)
0249E678 61071C99 (00000000, 00000006, 0249E6A8, 61078199)
0249E6C8 6106F232 (00000588, 00000006, 0249E6F8, 610B2C09)
0249E718 6106F3B0 (00000588, 00000006, 0249E768, 6106F965)
0249E728 6106F2FC (00000006, 00000006, 1000F7C6, 0249E778)
0249E768 6106F965 (610CB358, 1000F7C6, 1000F7C0, 1000F7B5)
0249EBA8 1000F857 (10010F50, 1013AD40, 0249EBC8, 610B465A)
0249EBC8 10010FAB (1013AD40, 100078C0, 0249EBF8, 10007964)
0249EBE8 10036B73 (100F7B80, 0249EE68, 0249EC58, 1002A13D)
0249EC48 1002A161 (10036B20, 100F7B80, 00000000, 00000000)
0249EDF8 1001D491 (10100448, 100F7B80, 00001D71, 00001D71)
0249EE38 1001DD28 (10100448, 100F7B80, 00001D71, 00000000)
0249F5A8 10018725 (1010AD80, 100F7DF0, 00001D49, 00000001)
0249FD78 10017FD3 (1010AD80, 100F8660, 0249FEB8, 10013EA4)
0249FEA8 100141B6 (00000000, 00000000, 0249FED0, 00401081)
0249FEB8 10014200 (00000002, 100D1A50, 610F063C, 00000004)
End of stack trace (more stack frames may be present)
=end
----- ここまで
On Mon, 5 Jan 2004 22:50:17 +0900
matz@ruby-lang.org (Yukihiro Matsumoto) wrote:
> まつもと ゆきひろです
>
> In message "[ruby-list:39023] 2GB を超えるファイルのサイズ"
> on 04/01/05, Takashi Seki <hawk.seki@nifty.com> writes:
>
> |File::size で
> |2,367,467,268バイトのファイルのサイズを取得したところ
> |-1927500028と帰ってきました。
> |
> |もしや2GBの制限があるのかとおもって調べたらfile.c に
> | /*
> | * call-seq:
> | * stat.size => fixnum
> | *
> | * Returns the size of <i>stat</i> in bytes.
> | *
> | * File.stat("testfile").size #=> 66
> | */
> |
> | static VALUE
> | rb_stat_size(self)
> | VALUE self;
> | {
> | return OFFT2NUM(get_stat(self)->st_size);
> | }
> |という記述がありました。
> |
> |やはりこれは制限でしょうか?
> |それとも、何らかの解決策はあるのでしょうか?
>
> Win32ではoff_tのsizeが4バイトと定義されているようです。とい
> うことで、RubyではなくWin32 portの制限でしょう。ちなみに
> Cygwinではoff_tのサイズは8バイトですから、この問題は発生しま
> せん。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
関 隆 (SEKI, Takashi)
---------------------------------------
[E-mail] hawk.seki@nifty.com
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=