3

私のコードでは、あるファイルから別のファイルにデータをコピーする必要がある状況があります。私が思いついた解決策は次のようになります。

const int BUF_SIZE = 1024;
char buf[BUF_SIZE];

int left_to_copy = toCopy;
while(left_to_copy > BUF_SIZE)
{
    fread(buf, BUF_SIZE, 1, fin);
    fwrite(buf, BUF_SIZE, 1, fout);
    left_to_copy -= BUF_SIZE;
}

fread(buf, left_to_copy, 1, fin);
fwrite(buf, left_to_copy, 1, fout);

私の主な考えは、memcpyのようなものがあるかもしれないということでしたが、ファイル内のデータ用です。2 つのファイル ストリームと合計バイト数を与えるだけです。少し調べてみましたが、それらしいものは見つかりませんでした。

しかし、そのようなものが利用できない場合、転送を最速にするためにどのバッファ サイズを使用すればよいでしょうか? 大きいほどシステムコールが少なくなりますが、システム上の他のバッファリングやキャッシュが台無しになる可能性があると考えました. 読み取り/書き込み呼び出しのペアのみを受け取るように、バッファーを動的に割り当てる必要がありますか? この特定のケースでの典型的な転送サイズは、数 KB から十数 MB です。

編集: OS 固有の情報については、Linux を使用しています。

EDIT2:

sendfile を使用してみましたが、うまくいきませんでした。適切な量​​のデータを書き込んだように見えましたが、ゴミでした。

上記の例を次のように置き換えました。

fflush(fin);
fflush(fout);
off_t offset = ftello64(fin);
sendfile(fileno(fout), fileno(fin), &offset, toCopy);
fseeko64(fin, offset, SEEK_SET);

機能していないように見えたので、フラッシュ、オフフェスト、シークを 1 つずつ追加しました。

4

4 に答える 4

11
于 2012-05-10T22:56:32.077 に答える
0

高速読み取りが考慮される限り、ファイルのマッピングを選択することもできます-mmapを使用したメモリマップI / O(mmapのマニュアルページを参照)。特に大きなファイルを扱う場合は、従来の I/O と比較してより効率的であると考えられています。

mmap は実際にはファイルを読み取りません。それをアドレス空間にマップするだけです。そのため、アドレス空間のその領域に実際にアクセスするまでディスク I/O は発生せず、非常に高速です。

または、最初にブロックサイズを確認し、それに従って読み取りを続行できます。その場合、コンパイラーが最適化を強化するため、これも効率的であると見なされます。

于 2012-05-11T05:18:07.590 に答える