質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.61%

c言語での大きな領域の確保

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 828

anpapa

score 16

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.
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • maisumakun

    2018/10/25 17:04

    それらの配列変数は、関数の中にありますか、それとも外ですか?

    キャンセル

  • anpapa

    2018/10/25 17:06

    ご指摘どうもありがとうございます。ヘッダファイルの中にあるので、関数の外にあります。

    キャンセル

  • dice142

    2018/10/25 17:08

    「これ以上」に関して具体的な数値がないようですが、質問は「上限がどこまで」というものなのか「ある値以上まで増やすには」というものなのか、どちらでしょう?

    キャンセル

  • anpapa

    2018/10/25 17:10

    失礼しました、質問文を訂正いたします。そちらと質問は、ある値以上まで増やすにはというものです。

    キャンセル

回答 5

checkベストアンサー

+7

サイズ計算してみました?

N=55000
double a[N][N];
double b[N][N][3];
double c[N];

a=8*55000*55000  =24,200,000,000=24GB
b=8*55000*55000*3=72,600,000,000=72GB
c=8*55000        =440,000       =440KB


cはたいしたこと無いので除外して、aとbだけで96GB必要です。
55000未満ならOKということでグローバル変数か静的変数にはなっていると思われそこは良いのですが、さすがに96GBは何かあってもおかしくないのでは・・・。
(すみません、具体的に何が起こるかはわかりません)

まず処理的に無理があるので全てをメモリに持たなくても済む方法を考えたほうがいいですね。
96GB(最終的にはもっと)はメモリ確保できたとしても仮想メモリを使っているはずですから、相当処理が重そうです。
物理的にメモリがそれだけ載っているなら話は別ですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

ヘッダファイルの中にあるって、もしかしてそのヘッダファイル、複数のソースからインクルードされて、無意味に多重に領域使ったりしてないですか?

で、それらの配列のサイズが全体でどれだけになるか計算してみましょう。
それで、どれだけ使うとエラーになるのかをはっきりさせましょう

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/25 17:37

    ありがとうございます、計算してみます。
    そちらと、ヘッダファイルについてですが、ヘッダファイルは最初のmain関数でのみ呼び出しており、複数回読み込んではいませんでした。

    キャンセル

+1

回答では有りません。
まず、なぜそんな大きな領域がいるのか考えましか?
そして、それは本当に必要なのでしょうか?

・・・エラトステネスの篩で、100億まで算出しても10G程度です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ttyp03さんの計算結果を借用すると、96GB 以上必要という事です。
ちょっと Windos10での ページファイルサイズがどうなっているか調べてみたところ、 64 ビット版の Windows に適したページ ファイルのサイズを決定する方法 なんてページがありました。
ここの記述によると、

RAM の 3 倍と 4 GB のいずれか大きな方  これは、ボリュームサイズ ÷8 に制限されます。 

という記述があります。この制限に引っ掛かっている可能性はないでしょうか? Linuxとかだと、ちょっと違うかも知れませんが、多分、同様の制限があると思います。

あっ、gdb上で動かした場合と言う事? それともgdb無しでも同じでしょうか。gdbで動かした時、エラー発生アドレスとか無いでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

結論から言うとそんなバカでかいメモリをstatic storageに割り当てるとか正気ではないので動的確保しましょう。また例えばWindowsだと一度に2GBを超える動的確保はやはり失敗しやすいので、小分けにして上げるなどしましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る