0

问题是,我必须读取文件并将其数据写入另一个文件。但是大小可能太大(大于8 gb)所以我按块(1 mb)读取文件,但我认为可以计算出块的最佳大小,那么我该怎么做呢?我应该使用什么工具?这是代码

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)))
        {
            counting++;
            check = (100 * ((timer.elapsed() + 50) / 100));//(10 * ((timer.elapsed() + 5) / 10));
            bytesPerSecond = 0;
        }
    }
    fin.close();
    fout.close();
}
else{
    qDebug()<<"Failed to open";
}

}

4

2 回答 2

0

我建议不要使用文件复制,而是使用std::filesystem::copy。该页面上有一个代码示例。

虽然我不知道会使用什么块大小,但我希望作者std找到合适的值。

如果需要,您可以计时执行该调用。

于 2021-09-08T00:15:52.323 回答
0

试试这个:https ://doc.qt.io/qt-5/qstorageinfo.html#blockSize

如果您有兴趣跟踪复制进度并同时优化复制速度,您可能需要编写特定于平台的代码。在 linux 上可能是sendfile(). 在 Windows 上,您可能需要调用 WinAPI ...但我会从一些幼稚的解决方案开始(就像您拥有的那样),然后尝试优化缓冲区大小(进行测量以测量每次更改的速度增益),然后才尝试使用平台原生调用(并再次测量)。

您也可以看看这个答案:Copy a file in a san an, safe and efficient way

还有这个:为什么用 C 复制文件比 C++ 快得多?

PS:测量改进时,请注意热身阶段。如果文件已经在缓存中,复制当然会快得多......所以第一次复制总是会更慢,随后的复制通常会更快,无论采用何种方法。换句话说,您必须确保比较“苹果对苹果”。

于 2021-09-08T07:41:55.773 回答