問題是,我必須讀取檔案并將其資料寫入另一個檔案。但是檔案的大小可能很大(大于8gb),所以我按塊(1mb)讀取檔案,但是我認為可以計算出塊的最佳大小,那么我怎么做呢? 我應該使用什么工具? 以下是代碼
const int BLOCK_SIZE = 1000000;
if(!(fin.open(QIODevice::ReadOnly)) == false &&
!(fout.open(QIODevice::WriteOnly)) == false) {
long long m_file_size = fin.size()。
QDataStream in(&fin)。
QByteArray arrayOfBytes。
int counting = 0;
int check = 0;
long int bytesPerSecond = 0;
Timer.start()。
for(size_t i = 0; i <= m_file_size / BLOCK_SIZE; i) {
arrayOfBytes = fin.read(BLOCK_SIZE)。
fout.write(arrayOfBytes)。
bytesPerSecond =BLOCK_SIZE;
if ((100 * ((timer.elapsed() 50) / 100)) > 999 && (100 * ((timer.elapsed() 50) / 100)) % 1000 == 0 & & check ! = (100 * ((timer.elapsed() 50) / 100)))
{
計數 。
check = (100 * ((timer.elapsed() 50) / 100));//(10 * ((timer.elapsed() 5) / 10));
bytesPerSecond = 0;
}
}
fin.close()。
fout.close()。
}
else{
qDebug()<<"Failed to open"。
}
}
uj5u.com熱心網友回復:
我建議使用std::filesystem::copy代替實作檔案拷貝。該頁面上有一個代碼樣本。
雖然我不知道將使用什么塊大小,但我希望std的作者找到合適的值。
而且,如果你想的話,你可以對該呼叫的執行進行計時。
uj5u.com熱心網友回復:
試試這個。https://doc.qt.io/qt-5/qstorageinfo.html#blockSize
如果你對跟蹤復制進度感興趣,并同時對復制速度進行優化,你可能需要撰寫平臺專用代碼。在linux上,它可能是sendfile()。在Windows上,你可能需要呼叫WinAPI... 但我將從一些天真的解決方案開始(就像你的那個),然后嘗試優化緩沖區的大小(進行測量以衡量每個變化的速度提升),然后才嘗試使用平臺原生呼叫(并再次測量)。
你也可以看一下這個答案。以合理、安全和高效的方式復制檔案
。還有這個。為什么用C語言復制檔案比C 快得多?
PS:在衡量改進的時候,我們要考慮的是如何將C語言和C 結合起來。
PS:在測量改進時,要注意熱身階段。如果檔案已經在快取中,復制當然會快很多......。所以第一次復制總是比較慢,而隨后的復制通常會更快,無論采用什么方法。換句話說,你必須確保 "蘋果對蘋果 "的比較。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/310183.html
標籤:
上一篇:QGridLayout,緊密的行和列,沒有填充或間隔
下一篇:如何在另一個物件內獲取一個物件?
