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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

11649閲覧

File size limit exceeded (Core Dumped) の解決方法(linux)

bayashiP

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

5クリップ

投稿2019/05/01 06:08

編集2019/05/12 10:16

C++で、あるバイナリファイルを読み込み、内容を変更して別のバイナリファイルへ出力するプログラムを作っています。
しかしファイルを書き出す際に、"File Size Limit Exceeded (Core Dumped)" というエラーメッセージが出てきてしまいます。(読み込みは問題なし)
入出力ファイルのサイズは、どちらも259MB程度です。

エラーメッセージなどで調べてみましたが原因・解決方法が分からず困っています。
アドバイスをいただけないでしょうか?

環境

OS: ubuntu 12.04 LTS (64bit)
コンパイラ: g++ 5.4.1

該当のソースコード

ファイル出力部分のコードです。
どうも fwrite のラインでエラーが起きているようです。
念のため sizeof(EvalParameters) を標準出力で確認して見たのですが、およそ259MBとなっていました。

c++

1void WriteParametersToBinary(const char* file_name){ 2 std::FILE* fp = std::fopen(file_name, "wb"); 3 if (fp == nullptr) { 4 std::printf("Failed to open %s.\n", file_name); 5 return; 6 } 7 8 //test 9 //cout << "Size of EvalParameters: " << sizeof(EvalParameters) << endl; 10 11 std::fwrite( params.get(), sizeof(EvalParameters), 1, fp); 12 std::fclose(fp); 13}

2019/5/12 追記
今更なのですが、クラスを含んだ構造体を fwrite 関数で読み書きするのは、大丈夫なのでしょうか?
EvalParametersは構造体なのですが、メンバに自作クラスを含んでいます。
それがエラーの原因になっている可能性はありますか?
(fread による読み込みでは、正しく値を読み込めていました。また下にある通り、macOSでは読み書き共にエラーは起こりませんでした。)


試したこと

  • OSのファイルサイズ上限に引っかかっているのかと思い、ulimitコマンドで確認して見た所、以下のような設定になっていました。
> ulimit -Sa core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 127716 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 127716 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
> ulimit -Ha core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 127716 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 4096 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) unlimited cpu time (seconds, -t) unlimited max user processes (-u) 127716 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited

(OSについてはあまり詳しくないのですが、この file size の数字が、プログラムの扱えるファイルサイズ上限を決めているということで良いのでしょうか?)

  • 同じプログラムを macOS (ver. 10.13.2 , 64bit), 上でコンパイル・実行したところ、特にエラーもなく実行できました。

以上です。
足りない情報、試すべき事がありましたら教えていただけますと幸いです。
よろしくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/05/01 09:42

"File Size Limit Exceeded"で検索かけると色々原因が有るようですが・・・
bayashiP

2019/05/01 09:55

本文にも書きましたが、、、色々調べてもわからなかったので、ここに質問しました。 というのも、そもそもそういったサイトで書かれているのはファイルサイズが2GBを超えているのが原因のものがほとんどで、同じ対策をしてみても解消されませんでした。サイズが259MBでこのエラーが出るのはなぜでしょうか?
bayashiP

2019/05/02 18:14

ありがとうございます。確認しました。 私の場合あまり大きいプログラムではないので、ログはせいぜい数十行程度になります。 実行時にログファイルの内容はクリアされるので、前回の実行分が溜まっていくということもないと思います。
yohhoy

2019/05/04 12:58

sizeof(EvalParameters) == 259MB == 271581184 または 259000000 という意味でしょうか?通常では考え難い構造体サイズですが...
bayashiP

2019/05/04 13:03

はい、そうです。 サイズの大きい多次元配列をいくつも含んでいるので・・・
guest

回答3

0

自己解決

解決しました。
原因は結局ファイルサイズ上限だったみたいです。
問題のプログラムは、Procmail→シェルスクリプト→そのプログラム というように呼び出されているのですが、このシェルスクリプト内で ulimit コマンドを試してみたところ、fsizeに上限が設定されていました。
結局なぜ直ったのかは分からないのですが、etc/postfix/main.cf ファイルを、動作していたマシンと同じように書き直したところ、解決いたしました。

ご回答いただいた皆様、どうも有難うございました。

投稿2019/06/05 04:27

bayashiP

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答の内容が少し変わるので、別の回答にします。

今更なのですが、クラスを含んだ構造体を fwrite 関数で読み書きするのは、大丈夫なのでしょうか?
EvalParametersは構造体なのですが、メンバに自作クラスを含んでいます。
それがエラーの原因になっている可能性はありますか?

ポインタ変数を含んでいるとポインタの先の情報は失われますが、それ以外は特に問題ないはずです。エラーとは関係ないと思います。ただし、読み込んだ後でクラスのメンバ関数が問題なく使えたかはちょっと覚えていません。

気になるようでしたら、データをシリアライズして書き出すという手もあります。
こちらの質問への回答が参考になると思います。

投稿2019/05/18 01:21

cugel

総合スコア220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ulimit -Sf と ulimit -Hf どちらも出力は unlimited ですか?

2019/05/03 追記
prlimit コマンドでも、ファイルサイズは無制限になっていますか?
また、次の簡単なプログラムを ./a.out 256 ./a.out 260 のようにして動かした場合、やはり259MBあたりで File size exceeded エラーが出ますでしょうか。

C++

1#include <cstdio> 2#include <string> 3 4int main(int argc, char* argv[]) 5{ 6 size_t size = std::stoul(argv[1]) * 1024 * 1024; 7 char* data = new char[size]; 8 std::FILE* rfp = std::fopen("/dev/urandom", "r"); 9 std::fread(data, size, 1, rfp); 10 std::fclose(rfp); 11 std::FILE* wfp = std::fopen("test.data", "w"); 12 std::fwrite(data, size, 1, wfp); 13 std::fclose(wfp); 14 delete[] data; 15}

投稿2019/05/02 04:40

編集2019/05/03 06:37
cugel

総合スコア220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bayashiP

2019/05/03 04:31

はい、どちらもulimitedでした。 念の為 ulimit -Ha , -Sa の結果を本文に載せておきました。
bayashiP

2019/05/04 03:11

有難うございます。 prlimitについては、Ubuntuのバージョンのせいかコマンドがありませんでした。 また、頂いたプログラムを実行してみたところ、特にエラーは出ませんでした。 試しに 1000, 2000, 3000 などを入力しても正常に動作しました。
cugel

2019/05/04 03:40

そうすると、ファイルサイズの制限は ulimit の出力どおり無制限と考えてよさそうです。 params の型と params.get() が何を返すか伺ってもよろしいでしょうか。
bayashiP

2019/05/04 06:15

paramsの定義は、 std::unique_ptr<EvalParameters> params; となっています。(EvalParametersはユーザ定義構造体) なので params.get() はパラメータを保持している EvalParameters型変数へのポインタを返しています。
cugel

2019/05/04 06:48

ますます謎ですね。 ファイルを書き出す先ですが、問題のプログラムと、テスト用のと、どちらも同じところにファイルを書いていますか?
bayashiP

2019/05/04 12:40

テスト用のとは、上にある、入力されたサイズのファイルを出力するプログラムのことでしょうか? そのプログラムでしたら、書き出しは別のファイルに行っています。
cugel

2019/05/04 13:12

わかりにくくてすみません。最初に出されたプログラムを動かした時にファイルを書き出したディレクトリと、私が書いたプログラムを動かした時にファイルを書き出したディレクトリは同じでしょうか? ファイルは別でよいのですが、ファイルを書くのは同じディレクトリにしてみてください。 同じディレクトリに書き出しても前者のプログラムではエラーになって、後者のプログラムではエラーにならないということだと、ちょっと理由が思いつかないです
bayashiP

2019/05/07 01:59

返信が遅くなってすみません。 同じディレクトリ内にファイルを出力するようにしてみましたが、それでもエラーは起きませんでした。
cugel

2019/05/13 15:09

いろいろ考えていたのですが、bayashiP さんのプログラムがエラーになって、私が書いたプログラムがエラーにならないという違いが発生する理由が分かりません。力及ばす申し訳ないです。
bayashiP

2019/05/14 09:57

いえいえ、とんでもないです。 とても参考になりました。どうも有難うございます。
bayashiP

2019/05/14 10:24

ちなみに、12日に本文に少し追記をしたのですが、そちらはお読み頂いていますでしょうか? クラスを含んだ構造体でも、fwriteは使って大丈夫なのか?という部分です。 もしご存知でしたら教えていただけますと幸いです。
sage

2019/05/14 11:42

関係ないとは思いますが、"max locked memory"をunlimitedにしてもエラーになるか確認してもらえないですか? ubuntuのC++のprintfプログラムが(読み込みの方では細かく区切っているのに)書き込み要求を処理する際、1回のI/O要求のサイズだけメモリーをロックしていたらこれでエラーになる可能性があるので。
sage

2019/05/14 12:08 編集

cugelさんのプログラムで書いたファイル、本当に指定した大きさのファイルが出来上がっていますか? (asciiとして書き込みopenしている場合、0x00がくるとそこでeofになってしまうのでは?) → write openする際、bayashiPさんのオリジナルのように"w"ではなく"wb"指定にする
bayashiP

2019/05/15 05:42

>sageさん 有難うございます。 >"max locked memory"をunlimitedにしてもエラーになるか確認してもらえないですか? 実験してみたのですが、同じエラーが起きました。 >cugelさんのプログラムで書いたファイル、本当に指定した大きさのファイルが出来上がっていますか? 出力ファイルは、確かに指定したサイズになっていました。ご指摘いただいた通り "wb" モードでも試してみたのですが、エラーは出ませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問