我试图读取存储为.txt的数据文件,其中一些非常大(> 1 GB)。似乎每次QFile尝试对大于600MB的文件使用.open()方法时,它都会冻结并崩溃。有没有比QFile打开大文件更好的方法?下面显示的if (_file.open(QIODevice::ReadOnly))
行下方的代码都没有执行,因此我认为崩溃发生在调用open方法的地方。
我从类似问题的答案中理解,读取大文本文件并不是处理大量数据的好方法,但遗憾的是这些是我无法控制的日志文件。我需要能够读取这些文件或优雅地处理/忽略超大文件,但我找不到有关如何检测最大读取大小的信息。我宁愿不必在文本编辑器中手动打开和拆分这些文件,因为我有大约一个TB的处理和手动拆分可能导致丢失重要信息。我并不过分关注这个程序的响应能力,任何用于打开文件的方法都可以考虑很长一段时间,因为这个程序将用于数据处理而不是任何用户交互。
感谢您的帮助
代码:
void FileRead::openNewFile()
{
if(_listOfFiles.size()>0)
{
_file.setFileName(_listOfFiles.at(0));
if (_file.open(QIODevice::ReadOnly)) //file opened successfully
{
_file.reset();
emit fileOpened();
emit fileOpened(_file.fileName());
qDebug()<<"File Opened";
qDebug()<<_file.fileName();
}
else
{
qDebug()<<"Unable to open file";
qDebug()<<_listOfFiles;
_listOfFiles.removeAt(0);
emit fileSent();
}
}
else
{
qDebug()<<"All files processed";
}
}
答案 0 :(得分:1)
我认为您正在重新使用已经打开的QFile,这可能会有问题。
对reset()
的调用毫无意义 - 您刚刚打开文件,按定义重置。
您尚未提供代码崩溃的确切位置的回溯。我无法重现您的问题 - 我有一个16GB的稀疏文件,我可以在Windows 7和OS X上的Qt 4.8和Qt 5.2上成功打开,读取和关闭。
如果你为此编写一个最小的测试用例(一个独立的应用程序除了打开文件,从它读取几个字节并关闭它之外什么都不做),你可能会发现它没有崩溃 - 问题出在代码的其他地方。