- ベストアンサー
Segmentation Fault (メモリ制限?)
Segmentation Fault (Fortranのプログラム)に関して質問です。 あるデータを処理するプログラムですが、小さなデータの場合問題ないですが、 大きなデータを扱うようになった場合Segmentation Faultとなります。 宣言している配列サイズを超えた部分のアクセスなどでSegmentation Faultが出ることがあるようですが、どうやらそのような現象ではなく、 メモリ制限にひっかかっている感じがいたします。 エラーが出る部分はどうやらSubroutine内の大きなデータ宣言を している部分のようです。(下の例ではtest bが表示れる以前に止まります。) !-------------------------------------------------- subroutine calc_tri( ) implicit none real*8 data1(3,200000) !<--- ここでエラー --> write(6,*) 'test b' !-------------------------------------------------- このような場合、配列データを減らす以外にどのような対策が あるのでしょうか? あるいはメモリ制限になりそうなデータ数が分る方法などあります でしょうか? 環境は linux (CentOS) intel Fortran Compiler version 8.0 Mem: 1GB topコマンドにて Memの使用割り合いは10%にもならないのですが コンパイラによるメモリ制限などもあるのでしょうか? subroutine内の配列の宣言はデータ数より多くとっていることは確認しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
スタックオーバフローを起こしているのでは。 ulimitとかでスタックサイズを引き上げるか、ALLOCATABLEな配列にしてヒープ領域を使うようにするとか。
その他の回答 (1)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
stack sizeかdata segment sizeの制限に到達したのでしょう。 ulimitないしlimitで制限値を変更できるようです。 "Google Answers: Understanding ulimit output" http://answers.google.com/answers/threadview?id=311442 「メモリの使用量を制限するには」 http://www.atmarkit.co.jp/flinux/rensai/linuxtips/537memulimit.html
お礼
ありがとうございます。 ulimitは使用していましたが、教えていただいたページではulimitの色々な使い方が掲載されていていいですね。 No.1さんへの回答で記載のようにとりあえずエラーはでなくなりました。
お礼
皆様 回答ありがとうございます。用語や対策などについて色々勉強になります。 教えていただいた用語などを自分なりに調べて理解したいと思います。 ulimitに関しては制限をゆるくした状態で実行していました。 (記載していませんでした。) プログラムの止まる部分ですが、投稿に記載した部分に間違いがありました。 !-------------------------------------------------- subroutine calc_tri(cpsn) implicit none integer cpsn real*8 data1(3,cspn) !<--- ここでエラー --> write(6,*) 'test b' !-------------------------------------------------- cspnにはデータ数が入りまして、Fortranではこのような引数を用いてデータ サイズを確保する方法がとれますよね? 上記でも小さなデータの場合は問題ありませんが、大きなデータでは何故か問題が 出ます。下記のようにすればSegmentation Faultはでなくなりました。 real*8 data1(3,200000) !データ数は195000 cspnの値はsubroutine読みだし前に書き出した段階では正常な値でした。 メモリをたくさん使ったときにcspnの値がおかしくなったのでしょうか? ----------------------------------------------------------------------