2012-01-16 8 views
8

私はファイルをUSBデバイスにコピーするコードの前にいます。 以下の部分は重要なものです:fread/fwriteでファイルをUSBにコピーする性能

while((bytesRead = fread(buf, 1, 16*1024, m_hSource)) && !bAbort) { 
    // write to target 
    long bytesWritten = fwrite(buf, 1, bytesRead, m_hTarget); 

    m_lBytesCopied += bytesWritten; 

事は、顧客が言った、それは通常のPC <に比べてかなり遅いです - > USBスピード。私はこれをコード化しなかったので、最適化するのは私の仕事です。

最初に完全なファイルを読み込んでから、そのファイルを1つのステップで書き込む方が良いのではないかと思いました。しかし、私はどのようにエラーが起こりやすいのか分かりません。 このコードは、すべてのバイトが正しく書かれている場合には、各copystepの後にもチェックします。そのため、処理が遅くなることもあります。

私はそうではありません。++ &ハードウェアの達人なので、私は物事をスピードアップし、コピーを成功させる方法を聞いています。

+2

ボトルネックの他の部分を参照してください。あなたはバッファサイズを変更する少しの改善を得るかもしれませんが、あなたの問題はおそらく別のものです。 –

+0

これは、この特定の問題で何かをしている唯一の部分です。だから、それはコードだけかもしれません。 –

+0

バイトが正しく書き込まれたことのチェックを削除します。最初の書き込みを信頼できない場合は、検証に使用する次の読み取りを信頼できません。 (私はあなたがエラーのためにbytesWrittenをチェックしていると仮定します)。 –

答えて

3
  1. お試しください大きなチャンクで読み書きしてください。 16M、32Mはファイルをコピーするのに悪いことではありません。あなただけあなたが常に呼び出すことができ、ファイルをコピーしたい場合は
  2. system()それは速くなります。
  3. コードは、すべてのバイトが正しく書かれている場合には、各コピーステープル後にもチェックされるため、処理が遅くなる可能性もあります。

    ハッシュ大きいチャンクを作成して確認できます。ファイルを64Mのチャンクに分割するのと同じように。その後、それらのチャンクのハッシュをマッチングします。 Bittorrentプロトコルにはこの機能があります。

  4. mmapまたはMapViewOfFileをご利用の場合は、ファイルを最初にに割り当ててください。それからusbに書きなさい。このようにしての読み取り操作はカーネルによって処理されます。

  5. Kerrekさんはmemcpymmapに登録しました。 memcpyと2 mmap edファイルは素晴らしいと思われます。

最新のオペレーティングシステムは、USBスティックを取り外すときにUSBスティックに書き込みます。削除する前に、データをキャッシュに書き込むだけです。 OSからのコピーがより速く表示されることがあります。

+1

#4は良いと思います:メモリマップし、 'memcpy'を使います。 –

+0

@KerrekSB +1。 2 'mmap'edファイルを持つ' memcpy'は素晴らしい選択肢です。私の質問を更新しました。 –

1

読み書きの重複はどうですか?

現在のコードでは、合計時間はtime(read original) + time(write copy)です。最初のブロックを読み取ってから2番目のブロックの読み取りなどを開始すると、合計時間はmax(time(read original), time(write copy))となります。最後のブロックはパイプラインされません)。

読み取りと書き込みに多少の時間がかかる場合は、ほぼ半分の時間になる可能性があります。

2つのスレッドまたは非同期IOで実行できます。残念ながら、スレッドと非同期IOはプラットフォームに依存しますので、システムのマニュアルを調べるか、適切な移植可能なライブラリを選択する必要があります。

+0

AFAIK、USB I/Oもほとんどプラットフォームに依存していますが、そうではありませんか? –

+0

@AndréCaron私はドライバをビルドしていると思いますが、この場合、ファイルシステムにアクセスしていると思いますので、ファイルを 'fopen'することができます(それは標準です)。 – fortran

0

私はちょうどc/C++関数で書かれたものよりも速く行うためのいくつかのOS固有の関数に行きます。

Linuxの場合、これはsendfileの機能です。 Windowsの場合CopyFileがその作業を行います。

関連する問題