フラッシュメモリやハードディスクへファイルの書き出しをfwriteで行い、
作成したファイルをfreadを使って読み込み、その前後でclock関数を呼ぶことで
読み書きの処理時間を算出するプログラムを作成しています。
具体的には以下のような処理を行わせています。
//書き込み用のバッファを作成
buf_w = (unsigned char*)malloc(BUFSIZE);
memset(buf,0,BUFSIZE);
//ファイル書き込み処理
fp = fopen("ファイル名","wb");
start = clock();
fwrite(buf_w,BUFSIZE,1,fp);
end = clock();
fclose(fp);
//読み出し用のバッファを作成
buf_r = (unsigned char*)malloc(BUFSIZE);
//ファイル読み出し処理
fp = fopen("ファイル名","rb");
start = clock();
fread(buf,BUFSIZE,1,fp);
end = clock();
fclose(fp);
以上の処理にて、BUFSIZEが1GB程度の場合は問題ないのですが、
BUFSIZEを200MB程度に減らした場合に読み込み速度が
ありえないほど速くなってしまうという問題が発生してしまいます。
(HDDやフラッシュメモリからの読み込みなのに転送速度が1000MB/sオーバーとか)
RAMDISKとして設置したXドライブで試すと読み書き共に1200MB/sくらいになるので、
もしかしたらメモリにキャッシュされたデータを直接読み込んでしまっているのでは……
などと考えているのですが、試行錯誤すれども回避策が思い浮かびません。
どなたか、この現象について心当たりのある方がいらっしゃいましたら何かアドバイスいただけると幸いです。
宜しくお願いいたします。
No.1ベストアンサー
- 回答日時:
こういう目的でfreadのような高水準I/O関数使うと正確な結果は得られません。
WindowsならWinAPI,Linuxならシステムコール使い、
キャッシュを使用しない設定でファイルを開いて読み書きすれば、それなりに安定したデータが得られると思います。
あと一回で1GBもメモリ確保したらスラッシングが起きてませんかね?
これも結果を不正確にする要素なのでもう少し小さいサイズ(20MB位)から始めた方がいいです。
ご回答有難うございます。
やはり低水準入出力使わないと駄目でしたか……
Linuxのシステムコールは若干経験があったのですが、WindowsではWINAPIを使えば良かったのですね。キャッシュを無効にして読み出す方法がある事を知り大変勉強になりました。
ご指摘の通り、WIN32APIのCREATE_FILEでFILE_FLAG_NO_BUFFERINGのフラグを立てて読み出しを行ったところ、ほぼ正確な値を得ることができました。
悩んでいた事を解決できすっきりしました。
メモリ確保容量も確かに1GBはどう考えてもまずいですよね。こちらも再考してみます。有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- C言語・C++・C# 100バイトのバイナリファイルを読み込んで別のファイルに書き込みたいのですが、型をどうすればいいのか 1 2022/11/03 17:11
- Perl Perlで特定文字列から特定文字列までを抜き出したい 4 2022/04/02 14:24
- C言語・C++・C# C言語について教えて欲しいです。 ファイルの中身をコピーするプログラムを作ってます aというファイル 7 2022/11/03 19:21
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- ドライブ・ストレージ ハードディスクのデータ回復について 15 2022/08/22 14:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
fgetsで2行目から文字化け
-
バイナリファイルをテキストフ...
-
ファイルサイズ指定し、ファイ...
-
C言語の質問です。クイズをテ...
-
VBSで指定行に挿入
-
ファイルオープンの関数につい...
-
0バイトファイルの作成
-
freadとfwrite
-
巨大なテキストファイル(可変...
-
c言語 2つのファイルを行ご...
-
fopen(書き込みモード)でファイ...
-
どんなプログラムを書いても指...
-
C言語初心者の質問失礼します。
-
バッファとは何ですか
-
フルパスから最後のディレクト...
-
FTPでputすると空ファイルが出...
-
windows.hがincludeされない
-
OLE又はDDEを使うVISUAL BESIC...
-
VB.NETで他のプロジェクトで作...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
バイナリファイルをテキストフ...
-
VBSで指定行に挿入
-
fgetsで2行目から文字化け
-
テキストファイルの行数を取得...
-
ファイルサイズ指定し、ファイ...
-
巨大なテキストファイル(可変...
-
【VB.Net】バイト型配列に読み...
-
fopenで開いたファイルのサイズ...
-
改行までの一文字ずつのファイ...
-
freadとfwrite
-
c言語 2つのファイルを行ご...
-
0バイトファイルの作成
-
fopen(書き込みモード)でファイ...
-
テキストファイルの先頭への文...
-
テキストファイルの文字列の削除
-
C言語での採番について
-
VS2010 MFC CStdioFileについて
-
続・EOF判定されない
-
C言語での改行コードの扱いにつ...
おすすめ情報