質問: c言語で書かれたプログラムがあり、Nの値に合わせて様々な処理を行うのですが、Nの値がある大きさ以上になると、セグメンテーション違反が出てしまい実行できません。 その対策として、コンパイルする際にオプション-mcmodel=mediumをつけるとうまくできていたのですが、N=55000以上になるとまたエラーが出てしまいます。 最大でNを150000まで増やす予定なのですが、どうすればよろしいでしょうか。 また、不明な点や必要な情報がありましたらお聞きください。宜しくお願い致します。 **追記2018/10/26** 様々なアドバイスどうもありがとうございます。 ttyp03さんに計算していただき96GBはかなり無駄が多いと感じ、プログラムの構造を考え直していました。 何名かの方も指摘してくださっていますが、なぜそんなに配列が必要かというと まず、三次元のデータが150000個あります。 それぞれの点の距離を計算し、ある半径内に含まれる点のペアを作成し、それらの距離を規格化し次の処理を行います。 その際に、それぞれの距離を格納しておくためにNの二乗分の配列が必要になっています。 ``` N =55000以上でエラー double a[N][N]; double b[N][N][3]; double c[N]; int d[N][6]; int e[N]; int f[N]; int g[N]; double h[N][3]; double i[N][3]; double j[N][3]; . . . . ``` ヘッダファイルは最初のmain関数でのみ呼び出しており、複数回読み込んではいませんでした。 ``` 配列数 doubleの数 12100550000 intの数 495000 double及びintの数 12101045000 double a[N][N];(3025000000) double b[N][N][3];(9075000000) double c[N];(55000) int d[N][6];(330000) int e[N];(55000) int f[N];(55000) int g[N];(55000) double h[N][3];(165000) double i[N][3];(165000) double j[N][3];(165000) ``` gdbで確認してみると、以下のようなメッセージが出ています。 ``` During startup program terminated with signal SIGSEGV, Segmentation fault. ```
回答: ttyp03さんの計算結果を借用すると、96GB 以上必要という事です。 ちょっと Windos10での ページファイルサイズがどうなっているか調べてみたところ、 64 ビット版の Windows に適したページ ファイルのサイズを決定する方法 なんてページがありました。 ここの記述によると、 > > RAM の 3 倍と 4 GB のいずれか大きな方 これは、ボリュームサイズ ÷8 に制限されます。 > > > という記述があります。この制限に引っ掛かっている可能性はないでしょうか? Linuxとかだと、ちょっと違うかも知れませんが、多分、同様の制限があると思います。 あっ、gdb上で動かした場合と言う事? それともgdb無しでも同じでしょうか。gdbで動かした時、エラー発生アドレスとか無いでしょうか?