File size limit exceeded (Linuxでのファイルサイズ2Gバイトの限界)

ここでは、「File size limit exceeded (Linuxでのファイルサイズ2Gバイトの限界)」 に関する記事を紹介しています。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
自前のプログラムで計算中、突如"File size limit exceeded"なるエラーを吐いて停止。Linuxでの最大ファイルサイズ2Gバイトの壁か?

環境は以下のとおり。

$ uname -a
Linux **** 2.6.9-42.ELsmp #1 SMP Wed Jul 12 23:32:02 EDT 2006 x86_64 x86_64 x86_64 GNU/Linux

$ ulimit -a
中略
file size (blocks, -f) unlimited
中略
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited


ワーク用のファイルのサイズを見てみたら、
$ls -l
-rw-r--r-- 1 **** **** 2147483647 Aug 17 20:40 hoge.tmp
となっていた。やはりLinuxでのファイルサイズ2G越えの問題っぽい。


問題のワーク用のファイルはNFS越しのところにおいてある。
NFS 2Gの壁によると、Version2では2G越えは無理で、Version3ならできるようだ。

まずは mount コマンドでNFSのバージョンを確認。
$ mount
中略
*.*.*.*:**** on **** type nfs (rw,nfsvers=3,bg,hard,intr,rsize=8192,wsize=8192,addr=*.*.*.*)
*.*.*.*:**** on **** type nfs (rw,nfsvers=3,bg,hard,intr,rsize=8192,wsize=8192,addr=*.*.*.*)
*.*.*.*:**** on **** type nfs (rw,nfsvers=3,bg,hard,intr,rsize=8192,wsize=8192,addr=*.*.*.*)

うーん。クライアント側から見る分にはおkなのか。サーバ側からは見られない環境なので片手落ちだけど…




手っ取り早く問題を切り分けたかったので、
$cat hoge.tmp hoge.tmp > fuga.tmp
とやって、問題点がファイルシステム側かプログラム側かを推測してみた。すると
$ ls -l fuga.tmp
-rw-r--r-- 1 **** **** 4294967294 Aug 18 20:54 fuga.tmp
となり、このファイルシステム自体には2Gバイトを超えるファイルが書き込める。すなわち、問題点はどうやらプログラム側にあるっぽい。




さて、「プログラミング/C,C++/2GBより大きなファイルの扱い」によると、LFS(Large File Support)を利用すればよい、とある。

そこには、LFSを利用するための前提条件および、LFSを有効にするための方法が書いてあるのでそれに従う。

なお,LFS を利用するためには,以下の2つの条件が満たされる必要があります.

Linux カーネルのバージョンが >= 2.4 であり,Glibc のバージョンが >= 2.2 であること.ext2, ext3 などの 2GB 以上のファイルに対応したファイルシステムを利用していること.
fseek() もしくは ftell() をプログラム中に書いてはならない.代わりに fseeko(), fseeko64() もしくは ftello(), ftello64() を利用すること.というのは, fseek, ftell のオフセットは long 型なので,IA-32 では 32-bit となってしまい,64-bit でないため.

LFS を有効にする方法は,2つあります.

_LARGEFILE_SOURCE と _FILE_OFFSET_BITS を定義する: fopen(), fseeko() などの非 LFS 版インタフェースは,コンパイル時に LFS 版インターフェースに置換されます.
_LARGEFILE_SOURCE and _LARGEFILE64_SOURCE: fopen64(), fseeko64() などの LFS 版インターフェースを明示的に利用できるようになります.


カーネルのバージョンは大丈夫だったので、glibcのバージョンを確認してみる

$ ls -l /lib*/libc-*
-rwxr-xr-x 1 root root 1484470 Jul 5 2006 /lib64/libc-2.3.4.so
-rwxr-xr-x 1 root root 1442931 Jul 5 2006 /lib/libc-2.3.4.so


大丈夫そうな感じ。


とりあえずコンパイルしなおしてテスト計算を流し始めてみた。結果が出るまではしばらく時間がかかるのでまたあとで。

最近はメモリやファイルサイズなどの32bitの限界にあちこち引っかかり始めてきた感じ。計算プログラムを64bitに対応させるまでの我慢かな。


余談だが、LFSという用語をぐぐっていたらちょっと紛らわしいに気づいたw
以下検索結果。
LFS
LFS Large File Support
LFS Large File System
LFS Large File Summit
スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://tekitobibouroku.blog42.fc2.com/tb.php/50-4b7db969
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。