私のコードでは、あるファイルから別のファイルにデータをコピーする必要がある状況があります。私が思いついた解決策は次のようになります。
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 つずつ追加しました。