アプリ版:「スタンプのみでお礼する」機能のリリースについて

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内の配列の宣言はデータ数より多くとっていることは確認しています。

A 回答 (2件)

スタックオーバフローを起こしているのでは。


ulimitとかでスタックサイズを引き上げるか、ALLOCATABLEな配列にしてヒープ領域を使うようにするとか。
    • good
    • 3
この回答へのお礼

皆様


回答ありがとうございます。用語や対策などについて色々勉強になります。
教えていただいた用語などを自分なりに調べて理解したいと思います。


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の値がおかしくなったのでしょうか?


----------------------------------------------------------------------

お礼日時:2005/08/21 22:33

stack sizeかdata segment sizeの制限に到達したのでしょう。


ulimitないしlimitで制限値を変更できるようです。

"Google Answers: Understanding ulimit output"
http://answers.google.com/answers/threadview?id= …

「メモリの使用量を制限するには」
http://www.atmarkit.co.jp/flinux/rensai/linuxtip …
    • good
    • 0
この回答へのお礼

ありがとうございます。

ulimitは使用していましたが、教えていただいたページではulimitの色々な使い方が掲載されていていいですね。

No.1さんへの回答で記載のようにとりあえずエラーはでなくなりました。

お礼日時:2005/08/21 22:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています