[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
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


In This Thread

Prev Next