
100Mを超えるファイルを扱っています。
中のデータは突合せ処理に使用しており、何度もファイルの頭から最後まで読み込みます。
サイズがサイズなので、指定バイト数分取り出し、読み終わったら次の指定バイト数分取り出すといったことをやっております。
この処理を繰り返しますと、メモリの使用量がどんどん増大してしまいます。
ファイルの最後まで読み終わった後、一旦ファイルクローズして、読み直しているのですが、メモリが開放された気配はありません。
どのようにすれば、メモリ使用量を増やさずに処理することができますか?
ご教授お願いします。
ファイルのオープン/クローズには、
fopen_s()
fclose()
ファイルの中身を取得する際には
fread()
を使用しております。
メモリの使用量はタスクマネージャで確認しています。
No.4ベストアンサー
- 回答日時:
以下で確認してみましたが ・・・
コンソールアプリで作成
1) 単にファイルから読み込んで
2) 読み込み成功したら閉じてまた開き シークして次を読む
3) ファイルの末尾まで 2)へ戻って繰り返し
4) 上記 1)から3)を 1000回繰り返す
タスクマネージャでのプロセスで確認 ・・・
参考コード VC2005
#include "stdafx.h"
// stdio.h, tchar.h をインクリュード
int _tmain(int argc, _TCHAR* argv[])
{
char buf[20481];
FILE *file1;
errno_t err;
unsigned _int64 nPos = 0L;
unsigned _int64 readcnt = 0L;
for( int n = 0; n < 1000; n ++ ) {
printf( "%d\n", n );
err = fopen_s( &file1, "Gallery.zip", "rb" );
if ( err != 0 ) {
printf( "FileOpen Error\n" );
return 1;
}
memset( buf, 0, sizeof( buf ) );
readcnt = fread( buf, 1, sizeof( buf ), file1 );
nPos = readcnt;
while( !feof( file1 ) ) {
fclose( file1 );
if ( 0 == fopen_s( &file1, "Gallery.zip", "rb" ) ) {
memset( buf, 0, sizeof( buf ) );
_fseeki64( file1, nPos, SEEK_SET );
fread( buf, 1, sizeof( buf ), file1 );
nPos += readcnt;
} else {
return 2;
}
}
fclose( file1 );
}
return 0;
}
No.3
- 回答日時:
ファイルを閉じないままどんどんオープンしてるような気がします。
fopen( );
while( 1 )
{
fseek( );
}
fclose( );
のようにオープン、クローズは1回にしてfseekのみ繰り返したらどうでしょう
No.2
- 回答日時:
if ( feof(file1) ) {
fclose(file1);
~
}
ファイルポインタが終端に移動していいない場合。
このループはfcloseせずにfopenを続けますが良いのでしょうか?
errno_t err;
err = fopen_s( &file1, "ファイルパス", "r" );
if(err != 0) {
printf("ファイルを開けません。\n");
fclose(file1);
exit(1);
}
上記の処理はループの外でいいはのでは?
蛇捉ですが、上のコードでfopenに失敗しているにもかかわらず、
fclose(file1)しています。開いてない物を閉じることはできません。
また、read_size = freadとありますがfreadはサイズなど返しません。
読み込んだ要素の個数を返却します。
No.1
- 回答日時:
そのファイルを読み込んでいる部分などのソースを支障の無い範囲で公開しましょう
mallocなどで動的に確保しているのか
char buf[1024]などと制定な確保なのか ・・・
動的に確保しているなら freeで開放処理が必要です
newならdeleteで ・・・
この回答への補足
失礼しました。
書き直している部分もありますが、大体の処理の流れはこのような感じになります。
宜しくお願いします。
********************
FILE *file1;//ファイル
unsigned __int64 position = 0L;// 読み込み位置
char read_buf[204801];//読み込みバッファ
int read_size;
・
・
・
while(1) {
・
・
・
errno_t err;
err = fopen_s( &file1, "ファイルパス", "r" );
if(err != 0) {
printf("ファイルを開けません。\n");
fclose(file1);
exit(1);
}
・
・
・
memset(read_buf, 0x00, sizeof(read_buf));
_fseeki64(file1, position, SEEK_SET);
read_size = fread(read_buf, 1, 204801, file1);
・
・
・
position = position + 204801;
if ( feof(file1) ) {
fclose(file1);
position = 0;
err = fopen_s( &file1, "ファイルパス", "r" );
if(err != 0) {
printf("ファイルを開けません。\n");
fclose(file1);
exit(1);
}
}
・
・
・
break;// 全ての処理が終わったらループから抜ける。
}
********************
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ノートパソコン あなたのパソコン(Windows限定)は何年使っていますか? 4 2023/05/27 08:04
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- USBメモリー・SDカード・フラッシュメモリー 銀行が振込データの受け渡しに未だにFDを使っている理由は「FDDがAドライブ固定だから」って本当? 11 2022/06/02 03:53
- ドライブ・ストレージ USBメモリ。信頼できるUSBメモリ容量は何ギガまで? 7 2022/04/14 07:31
- PDF PDFに精通した方に質問。JPEGファイル群を一つのPDFファイルにするときの容量変化について 6 2023/07/23 19:06
- Excel(エクセル) エクセルデータ。容量を減らすにはどうしたらいい? 11 2022/12/22 09:01
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/21 09:28
- Windows 10 explorerをedgeで開く方法 2 2022/06/05 14:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
営業秘密の漏洩について
-
CSVファイルへの保存の際、デー...
-
SSIを使わずに・・・
-
WAVファイル同士の結合が可...
-
【C&C++】指定行のみファイル書...
-
このサイトみたいに・・。
-
マウスポインタの変更
-
SGファイルって何ですか?
-
Arduinoでのライブラリファイル...
-
ダイアログ上でファイルドラッ...
-
C#で、フォームのタイトル名を...
-
フリーソフトウェアでflaファイ...
-
VB.NETでファイル操作
-
マッチング処理
-
USBメモリーのファイルを開くに...
-
ビットマップ画像をRGB値でエク...
-
C言語のfopenについて教えてく...
-
ファイルを記録してあるセクタ...
-
fprintfで文字化け
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語初心者の質問失礼します。
-
ファイル名の先頭にアンダース...
-
csvファイルを開かずに文字を検...
-
バッチで118項目のCSVを処理し...
-
CSVファイルへの保存の際、デー...
-
グローバル変数のよくない使い...
-
テキストファイルの最終行を削...
-
ドラッグアンドドロップでファ...
-
VB.NETによるプロセス間通信
-
VBAにてEXCEL以外のファイル(テ...
-
分割コンパイルの#defineについて
-
ファイルの結合
-
iniファイルに追記がしたいです。
-
VBに、Cのincludeのようなもの...
-
動画処理のライブラリについて
-
Cでのネットワークファイルの読...
-
ダイアログボックスで複数フォ...
-
C言語のfopenについて教えてく...
-
「VBScript」ADODB.Streamにお...
-
マウスポインタの変更
おすすめ情報