- ベストアンサー
高速なRAID0のデータ書き込み方法とは?
- RAID0のデータ書き込み方法について教えてください。
- ディスクにデータを書き込む際に高速化する方法はありますか?
- データ書き込みの効率を上げる方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
FILE_FLAG_NO_BUFFERING でと書いたてしまったので、試してみました。 基本的にMFCは使ってないのと、汚いのは見ないフリでお願いします。 無理なスワップが無いので、安定している感じですが、こちらの環境では、速度は気持ち上がった程度。 int aboutSize = 100000000; int bytesPerSector = 1024; // ダミー int unitSize = bytesPerSector * 64; int loopCount = aboutSize / unitSize; int fileSize = loopCount * unitSize; HANDLE file = CreateFile(path, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_DELETE_ON_CLOSE, NULL); char *buff = new char[unitSize + bytesPerSector]; char *addr = (char*)((DWORD64)(buff + bytesPerSector - 1) & ~(DWORD64)(bytesPerSector - 1)); DWORD written; DWORD begin = GetTickCount(); for (int pos = 0; pos < fileSize; pos += unitSize) { WriteFile(file, addr, unitSize, &written, NULL); } DWORD period = GetTickCount() - begin; delete[] buff; CloseHandle(file); char text[128]; wsprintf(text, "%d MB/sec", pos / period / 1000); MessageBox(NULL, text, "Statistics", MB_OK);
その他の回答 (2)
OK Web の方はわかりませんが、教えて!gooでは、締め切る時のラジオボタンでポイント発行するはずです。 ランキング入りを目指している人だと、ポイント無しはガッカリするかもしれませんね(笑)
最初に実行したときはかなり遅かったですが、何度か試してみると落ち着いてくるようです。 45078 ms for 2000MB しかし、このアクセスの仕方だと、バッファリングでメモリを食いつぶしてスワップが発生しているように思えます。 また、書き込みサイズを小さくして試してみると、 766 ms for 500MB となってしまい、OSの遅延書き込みで正確な計測ができていない事は明らかです。 この2つの問題をクリアするには、CreateFileでいうところの、FILE_FLAG_NO_BUFFERING で書き込むことだと思います。ファイルが大きいのでバッファリングは不要ですよね?
お礼
ご回答ありがとうございました。テストまでしていただいたようで、本当に感謝いたします。 参考にさせていただきます。 現在、問題なのは、この書き込み方だと、普通のHDの方が早くて、RAID0の方が遅いという減少がおきていることなのです。 そこで、新しく環境を用意しているところです。もし、新しい環境で動いたとしても、今回の問題が解決されたわかではないので、もし、思いあたることがあったら教えてください。よろしくお願いします。
お礼
ありがとうございました。 まだ、新しい環境が準備できていませんが、それができたら試させていただきます。 また、この掲示板の初心者なので、教えて欲しいのですが、回答をいただいた方にポイントを発行するのは、回答を締め切るときの、確か、良回答、次点のようなラジオボタンを選択すればよいのでしょうか? このお礼を書いている段階では、ポイントを発行する手段が無いように思います。 初歩的な質問でごめんなさい。