
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内の配列の宣言はデータ数より多くとっていることは確認しています。
No.1ベストアンサー
- 回答日時:
スタックオーバフローを起こしているのでは。
ulimitとかでスタックサイズを引き上げるか、ALLOCATABLEな配列にしてヒープ領域を使うようにするとか。
皆様
回答ありがとうございます。用語や対策などについて色々勉強になります。
教えていただいた用語などを自分なりに調べて理解したいと思います。
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の値がおかしくなったのでしょうか?
----------------------------------------------------------------------
No.2
- 回答日時:
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 …
ありがとうございます。
ulimitは使用していましたが、教えていただいたページではulimitの色々な使い方が掲載されていていいですね。
No.1さんへの回答で記載のようにとりあえずエラーはでなくなりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
VB6のメモリ解放に関して
-
VB.NETの配列の限界を教えてく...
-
エクセルでXY座標に並べられた...
-
Excel2010のinputboxで複数デー...
-
配列の中の最大値とそのインデ...
-
Variant型配列の文字コード変換
-
C#でbyte配列から画像を表示さ...
-
配列のペースト出力結果の書式...
-
VBA: Select Caseを短くしたい
-
配列の要素がすべてカラかどう...
-
大量の変数を定義するにはどう...
-
.NET 文字コードの変換
-
OutOfMemoryExceptionの回避策...
-
RPG 配列宣言について
-
Excelマクロ:配列データからグ...
-
Imagelist の使い回しについて
-
VBAでMODE関数をつくる
-
クリスタルレポートで文字列の...
-
2つ目のレコードの値を取得す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
エクセルでXY座標に並べられた...
-
vba フィルター 複数条件 3つ以...
-
配列のペースト出力結果の書式...
-
OutOfMemoryExceptionの回避策...
-
配列の中の最大値とそのインデ...
-
複数のtextboxの処理を一括で行...
-
Dir関数で読み取り順を操作でき...
-
VB6からの移行したいけど、VB.N...
-
COBOLの基本的な事なので...
-
構造体配列の特定のメンバーをF...
-
大量の変数を定義するにはどう...
-
EXCEL VBAの課題です
-
Redim とEraseの違いは?
-
VB.NETの配列にExcelから読み込...
-
VBAでMODE関数をつくる
-
VB.NETにて、構造体へデータを...
-
1ビットごとの配列を作りたい
-
VBAで配列引数を値渡しできない...
おすすめ情報