プロが教える店舗&オフィスのセキュリティ対策術

フラッシュメモリやハードディスクへファイルの書き出しを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くらいになるので、
もしかしたらメモリにキャッシュされたデータを直接読み込んでしまっているのでは……
などと考えているのですが、試行錯誤すれども回避策が思い浮かびません。

どなたか、この現象について心当たりのある方がいらっしゃいましたら何かアドバイスいただけると幸いです。
宜しくお願いいたします。

A 回答 (1件)

こういう目的でfreadのような高水準I/O関数使うと正確な結果は得られません。



WindowsならWinAPI,Linuxならシステムコール使い、
キャッシュを使用しない設定でファイルを開いて読み書きすれば、それなりに安定したデータが得られると思います。

あと一回で1GBもメモリ確保したらスラッシングが起きてませんかね?
これも結果を不正確にする要素なのでもう少し小さいサイズ(20MB位)から始めた方がいいです。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。

やはり低水準入出力使わないと駄目でしたか……
Linuxのシステムコールは若干経験があったのですが、WindowsではWINAPIを使えば良かったのですね。キャッシュを無効にして読み出す方法がある事を知り大変勉強になりました。

ご指摘の通り、WIN32APIのCREATE_FILEでFILE_FLAG_NO_BUFFERINGのフラグを立てて読み出しを行ったところ、ほぼ正確な値を得ることができました。
悩んでいた事を解決できすっきりしました。

メモリ確保容量も確かに1GBはどう考えてもまずいですよね。こちらも再考してみます。有難うございました。

お礼日時:2008/10/23 23:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!