如何使用 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:衡量改进时,请注意热身阶段。如果文件已经在缓存中,复制当然会快得多...因此,无论使用哪种方法,第一次复制总是会比较慢,而后续复制通常会更快。换句话说,您必须确保比较“同类”。
问题是,我必须读取文件并将其数据写入另一个文件。但是大小可能太大(大于 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:衡量改进时,请注意热身阶段。如果文件已经在缓存中,复制当然会快得多...因此,无论使用哪种方法,第一次复制总是会比较慢,而后续复制通常会更快。换句话说,您必须确保比较“同类”。