私は私がしてきた、これを行うためのQT(5.6.1)QT - qfileにより、コピー操作は極めて遅い
を使用して、別のフォルダからのファイルの多くをコピーする必要があるアプリケーションを開発していますQFile::copy()
メソッドを使用します。 1つのことを除いて、これはうまくいく:極端にが遅い。同じコピー操作がWindowsエクスプローラを使用して実行する時間の2倍以上の時間を要します。これはた理由
疑問に思う、私はQTのソースコードに掘った、と私はqfile.cpp
でこれを見つけ、関連見えた:
char block[4096];
qint64 totalRead = 0;
while(!atEnd()) {
qint64 in = read(block, sizeof(block));
if (in <= 0)
break;
totalRead += in;
if(in != out.write(block, in)) {
close();
d->setError(QFile::CopyError, tr("Failure to write block"));
error = true;
break;
}
}
だから、私が理解から、コピー操作を使用しています4096-バイトバッファ。コピー操作ではこれは非常に小さく、問題の原因になる可能性があります。それから私は、この変更を含めて全体QTライブラリを再構築
char block[4194304]; // 4MB buffer
: だから私がやったことに、バッファのサイズを変更しました。しかし、すべての修正は、メソッドを完全に中断させることでした。私のアプリケーションがQFile :: Copy()を呼び出そうとすると、操作は即座に中断されます(メソッドは実行されず、QtCreatorのデバッガに従って最初の行の前で停止します)。デバッガが私に語った:
The inferior stopped because it received a signal from the Operating System.
Signal name :
SIGSEGV
Signal meaning :
Segmentation fault
私のC++は少し錆びですが、私は、配列の割り当てサイズを変更すると、完全に法を破ることができる方法を理解していない...誰もがいずれかの方法で助けることができる:
1)QFile:Copy()が遅い理由を教えてください(私は何か不足していますか?それは私のPCだけではなく、いくつかの異なるマシンでテストされています)。そして、coulpritは実際に上に投稿したコードなのでしょうか、まったく別のものですか? 2)その1つの変更がQFileを完全に破る理由を教えてください
qtbase( 'tests/benchmarks/corelib/io/qfile')にベンチマークがあり、異なるブロックサイズを使ってWin32上のファイルを読み込もうとします。 4Kが普遍的に選ばれた理由はわかりません。おそらく、それはハードディスクの技術に依存していますか?ベンチマーク( 'readBigFile_Win32'テスト関数)を実行してチェックしてみることができますか? – peppe
Windowsでは、あなたの最善の策は、CopyFileExを使用することです。[完全な例](http://stackoverflow.com/q/19136936/1329652)進捗状況を参照してください:) –