2

最近、ネットワーク ドライブ上の大きなファイルの読み取りに問題があり、何が間違っているのか特定できません。私は C++ (アンマネージ) と C# の両方で試しましたが、両方でほぼ同じパフォーマンスでした...これはややひどいものでした。

ネットワーク上で 4 KB/秒のファイルを読み取ることもありますが、このファイルがローカル HD にある場合は、HD が出力できる最大データ レートを簡単に達成できます。それは、一度に 64 KB のチャンクを読み取ることです...私は非常識な数まで、またはそれ以下の大きなバッファで試しましたが、大きな違いはありません。

FileStream で BeginRead を使用して C# で非同期 IO を試し、C++ で OVERLAPPED IO と同期読み取りを試しましたが、すべて同じ問題があり、ネットワーク上で低速になっています。

私たちが思いついた唯一の解決策は、実際にファイルを読み取る前に、OS の CopyFile 機能を使用してローカル HD にファイルをコピーすることですが、この方法にはあまり満足していません。CopyFile が私たちとは違うことをしているように見えるだけで、私たちのアプローチよりも信じられないほど高速です。

これがなぜなのか、誰にも手がかりがありますか?

4

2 に答える 2

0

あなたは私たちにあなたのコードを見せていないので、私たちは推測しなければならないでしょう。したがって、私の推測では、WindowsファイルコピーはFILE_FLAG_SEQUENTIAL_SCANフラグを使用してファイルを開いています。これにより、ファイルシステム/キャッシュは最適なブロックサイズを選択し、まだ送信されていない読み取り呼び出しを見越して読み取り要求を送信します。

于 2010-02-26T01:19:00.893 に答える
0

可能な限りすべての読み取り/書き込み方法を試しているとしか思えません。同期的または非同期的に読んでいますか? I/O 完了ポートを試しましたか? または ReadFileEx() 関数? Windows の CopyFile() 関数は、ネットワークからファイルを読み取る必要があることを検出し、ディスク アクセスに使用する方法とは異なる読み取り方法を使用すると思います。

可能なすべての読み取り方法を本当に使い果たした場合、そして本当に問題を解決する必要がある場合は、CopyFile() 関数が何をしているのかを少し調べてみることをお勧めします。そのためのツールは数多くあります。例:これ(または他の -- 同じページのリンク)。

于 2010-03-22T08:56:31.713 に答える