アプリ版:「スタンプのみでお礼する」機能のリリースについて

VC++を使って、Windows2000,XPのプログラムを作成しています。

現在、1秒間に70MB程度のデータを書き込む必要があり、RAID0を使っているのですが、RAID0を使っていない、普通のハードディスクの方が書き込みが早いです。

方法としては、
CFile::SetLengthでファイルの大きさを決めて
CFile::Writeで書き込んでいます。

RAID0に高速書き込みする方法があれば、教えてください。よろしくお願いします。

使っているマシンのスペックは低くありません。
CPUは2GのXEONが2つついています。

HDBENCHというベンチマーク用ソフトウエアでRAID0のハードディスクを確認したところ、100000KB/sec以上の結果が出ました。
しかし、なぜか私の作ったプログラムでは、RAID0を使っていないHDで、ベンチマークの結果も50000KB/sec程度のHDの方が結果が良かったです。

書き込みブロックも変更して試したのですが、良い結果は出ませんでした。

現状の感じとしては、RAID0に書き込むと、遅延書き込みが起きているけれど、RAID0でない場合は、遅延書き込みの頻度が少ない感じがします。
書き込むたびに、CFile::Flushを呼ぶことで遅延書き込みはなくなるのですが、書き込みは早くありませんでした。

A 回答 (4件)

Win32API の CreateFile と WriteFile を使って、書き込む単位を何種類か(64K、1M、10Mくらい)で計測してみてはどうでしょう。



ソースが公開されていないベンチマークの結果は参考にしかなりません。
    • good
    • 0
この回答へのお礼

確かにソースが公開されていないと、何をやっているんだかわかりませんね。

私が使っているCFile::Writeの中は、下記です。
void CFile::Write(const void* lpBuf, UINT nCount)
{
ASSERT_VALID(this);
ASSERT(m_hFile != (UINT)hFileNull);

if (nCount == 0)
return; // avoid Win32 "null-write" option

ASSERT(lpBuf != NULL);
ASSERT(AfxIsValidAddress(lpBuf, nCount, FALSE));

DWORD nWritten;
if (!::WriteFile((HANDLE)m_hFile, lpBuf, nCount, &nWritten, NULL))
CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);

// Win32s will not return an error all the time (usually DISK_FULL)
if (nWritten != nCount)
AfxThrowFileException(CFileException::diskFull, -1, m_strFileName);
}

結局WriteFileを使っていました。また、書き込む単位も、クラスターの倍数でいろいろ試してみたので、他に何か問題があるかもしれないと思ってます。
とりあえず、自分がテストしたソースを公開してみます。

お礼日時:2004/09/09 08:52

#2には、誤字がありましたね。

失礼しました
・普通のHDDとRAID用のHDD[は]同型品ですか?
ですね

RAIDのHDDのキャッシュが少ないのですね。
まあそれでもベンチマークではRAIDの方が早いので影響はないようですね

さて、
テストプログラムでは、クラスターの大きさのメモリの書込みということですが
実際はどうやっておられるのでしょうか
小さすぎる可能性はないでしょうか?

他に考えられる原因は、
HDDが異なる型の場合には、たまに同期がとれなくて余分に時間がかかる場合がありますが
ベンチマークの結果からしても、そうではないようですね
それ以外にRAIDに影響が多い場合というと、ランダムアクセスでは遅くなる可能性はありますが、
大丈夫でしょうか?

RAID上には、出力データだけでプログラムファイルなどは無いのですよね?
構成と入力データを聞いたのは、たとえば入力データがRAID上にある場合だと、
今回のような現象がおきる可能性があるためです
メモリ上のデータを書き込んでいるのならば、そうではないようですが。

上記で原因が判明しない場合には、
テストプログラムのソースを出せば、他のひとからもっとレスが得られる気がします
    • good
    • 0
この回答へのお礼

ありがとうございます。

テストプログラムを出してみます。

お礼日時:2004/09/09 08:48

C++は遅いとはいえ、同じプログラムでRAID0が遅いのはおかしな現象ですね


・機器構成(HDDの接続やメモリなど)はどうなっていますか?
・普通のHDDとRAID用のHDDの同型品ですか? 仕様は?
・比較試験の入力元データは何でしょうか?
    • good
    • 0
この回答へのお礼

>・普通のHDDとRAID用のHDDの同型品ですか? 仕様は?
違います。ベンチマークの結果、HDのキャッシュが多い方が書き込みが早かったので、普通のHDDというのには、キャッシュが8Mのものを使っています。

>・比較試験の入力元データは何でしょうか?
このデータは何にしても変わりありませんでした。
例えば、テストプログラムで、クラスターの大きさのメモリを確保して、ループを回してそれを書き込んだ場合も、RAID0の方が遅かったです。

HDBENCHというソフトウエアでの書き込みが毎秒100MBを超えているので、構成が悪いとはどうしても思えません。

お礼日時:2004/09/08 16:07

RAIDにはソフトウェアRAIDとハードウェアRAIDがありますが、貴殿の環境はソフトウェアRAIDなのではないでしょうか?


もし、ハードウェアRAIDであれば、キャッシュの設定(遅延書き込みの有無など)とかが出来る可能性がありますよね。
また、複数のハードディスクを別のバスに繋げ、RAIDチップが制御することでRAID0の高速化が望めるのだと思います。
例えば、IDEのハードディスクを一つのケーブルでプライマリーとオルタネートのように繋いで、ソフトウェアRAIDでRAID0では、高速化は望めないどころか、低速になってしまうのではないでしょうか?

この回答への補足

”遅延書き込み”と書いたのは、私(質問者)の勘違いでした。
プログラムにバグが存在していました。
結局のところ、ただ、書き込みが遅くなっているというのが現状です。RAID0を使えば、ただ書き込みが早くなると思ったのに。。。

補足日時:2004/09/08 14:49
    • good
    • 0
この回答へのお礼

下記のRAIDカードを使用しています。

3ware Escalade 7000 Series ATA RAID Controller

ベンチマークソフトでは、結果が出ているので、自分のプログラムが最適化されていないか、問題があるように感じています。

お礼日時:2004/09/08 13:49

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