
よろしくお願いします。
一ファイル20万行程度のCSV形式のテキストファイルが、50個ほどあります。
これを一行づつ読み込んで、strtok( ,",")でデータを取得しようと思っています。
ファイルの行数はまちまちなので、新しいファイルを読み込むときに
そのファイルの行数を調べて(ここでは count 行あります)
callocをつかって、メモリを確保しました。
btxt=(char **)calloc(count,sizeof(char *));/*動的メモリ確保*/
for(i=0;i<count;i++) btxt[i]=(char *)calloc(120,sizeof(char)); /*一行120文字まで*/
if(btxt==NULL){printf("btxt 確保エラー\n"); exit(0);}
上記btxt配列にすべての行数を読み込んで、strtok()処理をした後
for(v=0;v<120;v++){
if(btxt[v]){
free(btxt[v]);
btxt[v]=NULL;
}
}
free(btxt);
btxt=NULL;
で解放してから、次のファイルに移ります。
問題は、ループするごとにメモリ容量がどんどん減ってきて、30ループもさせると
メモリ不足でエラーが出ることです。
ブレークポイントを使って調べてみたのですが
ループ一回目 calloc前 707.7 MB: calloc後 748.6MB 解放(したつもり)後 747.9 MB
ループ二回目 calloc前 750.6 MB: calloc後 794.6MB 解放(したつもり)後 793.8 MB
・・・・・・・・・・・・・・・・・・・
ループ四回終了時には868.3MBにもなって、初めより160MBも使ってしまいます。
free()が効いてないと思うのですが、どこがおかしいのか教えてくださいませ。
No.2ベストアンサー
- 回答日時:
for(i=0;i<count;i++) btxt[i]=(char *)calloc(120,sizeof(char)); /*一行120文字まで*/
for(v=0;v<120;v++) if(btxt[v]){free(btxt[v]);btxt[v]=NULL;}
上の2行をよく見比べてください。何回callocして何回freeしてますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UWSCの終了の仕方
-
画面を強制的に再描画させる方法
-
Escキーを押すと、中断する時と...
-
DOSコマンドのループ内のTIMEコ...
-
For文を使った九九表の作成
-
VBAでの一時停止と再開の方法
-
ループフリー
-
VBAで3秒だけ時間を止めたい
-
DoEventsが必要な理由について
-
VBA for i=1 to lastrow
-
CSVファイルの特定の行だけを読...
-
EXCEL VBA ユーザーフォームの...
-
VBA エクセル2010 横長データ...
-
レインボー色ってどうやって表...
-
エクセルの当番表を作っていま...
-
UWSCのスクリプトで行き詰って...
-
乱数の桁数指定、または範囲指定。
-
メッセージループを調べすぎてC...
-
vb.netからエクセル関数書き込み
-
Java 南京錠
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
CSVファイルの特定の行だけを読...
-
範囲指定したセルを1つずつ飛...
-
UWSCに制限時間を付けたいです
-
Escキーを押すと、中断する時と...
-
乱数の桁数指定、または範囲指定。
-
VBA for i=1 to lastrow
-
流れ図(フローチャート)が分か...
-
DOSコマンドのループ内のTIMEコ...
-
pythonでファイルのコメント行...
-
素数表について。
-
VBAでの一時停止と再開の方法
-
「偶数・奇数の和」のフローチ...
-
DoEventsが必要な理由について
-
vb.netです。2次元配列の要素を...
-
Do whileでExitせず、ループの...
-
ループフリー
-
エクセルの当番表を作っていま...
-
VBAで3秒だけ時間を止めたい
おすすめ情報