
フラッシュメモリやハードディスクへファイルの書き出しを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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バイナリファイルをテキストフ...
-
ファイル内のデータを1行削除...
-
fgetsで2行目から文字化け
-
fopenで開いたファイルのサイズ...
-
VS2010 MFC CStdioFileについて
-
Access クエリ実行が急に非常に...
-
営業秘密の漏洩について
-
C言語初心者の質問失礼します。
-
FTPでputすると空ファイルが出...
-
テキストファイルの最終行を削...
-
エクセルVBAで相対パスでファイ...
-
フルパスから最後のディレクト...
-
シェルコマンドの 2>&1 とはど...
-
バッファとは何ですか
-
c言語でファイルのタイムスタン...
-
OLE又はDDEを使うVISUAL BESIC...
-
FTPでリモートのファイル一覧取得
-
vba ActiveSheet.pasteを使った...
-
VB.NETで他のプロジェクトで作...
-
エラーの原因は?「この関数の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルの行数を取得...
-
ファイル内のデータを1行削除...
-
バイナリファイルをテキストフ...
-
fgetsで2行目から文字化け
-
ファイルサイズ指定し、ファイ...
-
c言語 2つのファイルを行ご...
-
0x00をファイル出力
-
C言語での採番について
-
VBSで指定行に挿入
-
テキストファイルの先頭への文...
-
fopen(ファイルパス)
-
C言語での改行コードの扱いにつ...
-
fopenで開いたファイルのサイズ...
-
winsock recvでの文字化け
-
EOF判定されない
-
fscanf関数のscanf集合を使う時...
-
巨大なテキストファイル(可変...
-
VS2010 MFC CStdioFileについて
-
(UWSC)このような場合、解決策...
-
改行までの一文字ずつのファイ...
おすすめ情報