• ベストアンサー

メモリの確保について教えてください。

いつも拝見させて頂き、かなり勉強させていただいております。 今日は思い切って質問させていただきます! まだ独学でC言語の勉強を始めたばかりなので、分かっていないことも多く、不明瞭な書き方になってしまったら、申し訳ありません。 ファイルやデータベースから情報を読み込み、それを別のデータベースへインサートするプログラムを作っています。 fgetsやfetchでデータを取得するのですが、これまではループ(while(1))を使って 1行分のデータを取得し、簡単な処理(printfやカウントを取る等)をして、別データベースへインサートする。 という処理を、全てループ内で行ってきました。 しかし、今回は構造体を用意し、データの件数分の構造体領域をmallocで確保して簡単な処理を行い、別データベースへインサートするという課題があります。 mallocでは必用な分だけメモリを確保できるため、無駄がないと知りましたが、前に書いたようにループ内で取得からインサートまでを行う処理でも無駄は出ないように思います。 だとしたら、ループ内で全ての処理を行うのと、メモリを確保するのとでは何か違いや利点があるのでしょうか? もしくは、方法の違いだけで、どちらを使うかは違いがないのでしょうか? とても基本的な質問でしたら、申し訳ないのですが アドバイスを頂きたいと思います。どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★単純に入力から出力へデータを送るなら malloc は不利。 ・メモリを確保するのにも『多少』時間がかかりますし、もし万が一メモリ不足になったらその場合の  処理・対策をループ内などで行う分面倒です。 ・他にもデータベースを読み取り、別のデータベースへインサートするだけならばループ内で行う方が、  1行分のデータメモリで済みます。メモリ資産を大切に! ・それで、今回は『構造体』にデータ件数を読み込んで『簡単な処理』を行った後、別のデータベースへ  インサートする課題ですね。 ・読み込んだデータでどんな処理を行うか分かりませんが、ソートなどを行うには一括で構造体などに  読み込んでから処理した方が効率が良いでしょう。このように『一括』で処理するにはメモリへ読み込む  必要がありそうです。これ以外は特に malloc 関数を使って処理する意味はないように思います。 ・もし、単純なカウントだけならば『課題』という『malloc』関数の勉強という意味ぐらいでしょね。  多分、『構造体』と『malloc』関数の使い方のための『課題』でしょう。 ・以上。おわり。→参考にして下さい。

empuru
質問者

お礼

Oh-Orange様 丁寧なご回答をどうもありがとうございます! とても勉強になりました。 データを一括して処理をするため、構造体へ読み込む必用があるということに気づいていませんでした。 今回の課題では一括して処理をするようなことはないようにも見えるのですが、私が気づいていないだけかも知れません。 本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • amru05
  • ベストアンサー率63% (33/52)
回答No.4

現実の場合、 1)I/O処理は時間がかかるので、なるべく少ない回数が良い   たとえば、ループで100回I/Oするより、100回分のデータエリアを確保しておき、1回のI/Oで済ませる方が早い。 2)データエリアの確保方法として変数をアレーにし関数内に記述するのが簡単だが、そうするとスタック上にデータエリアが確保されてしまい、処理系にも寄りますが、大体8M程度のデータサイズまでしか確保できない(コンパイラの設定で増加できますが、VC++などはデフォルトが大体8Mだったような。。。)。 3)関数外にグローバルに変数をアレーにし確保する方法もあるが、これも限界がある(VC++で256M程度だったような。。)。 4)それ以上に大きなエリアを確保するにはmallocを使用する(32ビットOSの場合2G程度までは可能のはず。。) 5)それでも不足する場合64ビットOSでmallocを使用する。   ==> まあ、こんなものです。私は5)まで必要なAPLを作成していますが、通常は滅多に無いので3)程度で終わらせています。   ある程度のエリア確保とループ処理の組み合わせが現実的だと思います。

すると、全ての回答が全文表示されます。
noname#39970
noname#39970
回答No.2

ループ内で終わっているなら手間の分だけmallocの方が手間。 No1でも書かれてるけど、そうでなくループ外や ループのように見える場合や処理を別の場所に渡す場合などの改造を施す場合はどうするつもり? メモリ確保が要るんじゃない?

empuru
質問者

お礼

SAYAKA様 ご回答ありがとうございます。 一括しての処理の他に、処理を分けたりする際に必要ということに気が付きました! 改造まで考えていなかったので、新たに気づくことができました。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

処理としては意味はないが、課題として意味があるというだけかもしれません。 ひとつの入力レコードに施す加工がそのレコードに閉じているのなら、1レコード分だけのメモリをmallocすれば足ります。

empuru
質問者

お礼

a-saitoh様 ご回答ありがとうございます。 1レコード分すらmallocしていなかったため、ループ内で行う際もmallocするということに気が付きました。 どうもありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A