如何使用 QIODevice:read() 计算要从文件中读取的最佳字节大小?

How do I calculate the opimal size of the bytes to read from a file using QIODevice:read()?

问题是,我必须读取文件并将其数据写入另一个文件。但是大小可能太大(大于 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";
}

}

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

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

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

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

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

你也可以看看这个答案:Copy a file in a sane, safe and efficient way

还有这个:Why is copying a file in C so much faster than C++?

PS:衡量改进时,请注意热身阶段。如果文件已经在缓存中,复制当然会快得多...因此,无论使用哪种方法,第一次复制总是会比较慢,而后续复制通常会更快。换句话说,您必须确保比较“同类”。