Qt QFile无法打开大文件

Qt QFile无法打开大文件,qt,qfile,Qt,Qfile,我正在尝试读取以.txt格式存储的数据文件,其中一些文件非常大(>1GB)。似乎每次QFile试图在大于600MB的文件上使用.open()方法时,它都会冻结并崩溃。有没有比QFile更好的打开大文件的方法?下面显示的if(_file.open(QIODevice::ReadOnly))行下面的代码都不会执行,因此我相信在调用open方法的地方会发生崩溃 我从对类似问题的回答中了解到,阅读大型文本文件并不是处理大量数据的好方法,但不幸的是,这些是我无法控制的日志文件。我需要能够读取这些文件或优雅

我正在尝试读取以.txt格式存储的数据文件,其中一些文件非常大(>1GB)。似乎每次QFile试图在大于600MB的文件上使用.open()方法时,它都会冻结并崩溃。有没有比QFile更好的打开大文件的方法?下面显示的
if(_file.open(QIODevice::ReadOnly))
行下面的代码都不会执行,因此我相信在调用open方法的地方会发生崩溃

我从对类似问题的回答中了解到,阅读大型文本文件并不是处理大量数据的好方法,但不幸的是,这些是我无法控制的日志文件。我需要能够读取这些文件或优雅地处理/忽略过大的文件,但我找不到有关如何检测最大读取大小的信息。我宁愿不必在文本编辑器中手动打开和拆分这些文件,因为我有大约1 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";
    }
}
void FileRead::openNewFile()
{
如果(_listOfFiles.size()>0)
{
_setFileName(_listOfFiles.at(0));
如果(_file.open(QIODevice::ReadOnly))//文件已成功打开
{
_file.reset();
emit fileOpened();
emit fileOpened(_file.fileName());

qDebug()我认为您使用的是一个已经打开的QFile,这可能会有问题

调用
reset()
是没有意义的-您刚刚打开了文件,它根据定义被重置

您没有提供代码崩溃具体位置的回溯。我无法重现您的问题-我有一个16GB的稀疏文件,可以在Windows 7和OS X的Qt 4.8和Qt 5.2上成功打开、读取和关闭


如果您为此编写了一个最小的测试用例(一个独立的应用程序,除了打开文件、从中读取几个字节并关闭文件之外什么都不做),您可能会发现它没有崩溃-问题出在代码的其他地方。

通常只打开()没有问题-无论大小。我可能猜您可能会遇到障碍,例如:由于另一个进程锁定了文件-正如您提到的想法之一,您将其称为日志文件。@yshurik:日志位于一个目录中,没有在任何其他程序中打开(它们是几个月前生成的,我正在尝试解析和总结它们。)我的代码将在600MB的文件上运行。这可能是因为在QtCreator中运行了它,而不是以.exe的形式运行吗?我在输出中没有看到任何qDebug消息,这就是为什么我认为问题在于.open()。那么你就打开它们?你也许可以测试std::ifstream?@user2672165_file是一个QFile成员变量,一个单独的插槽一次读取100行文件,以避免将一个大文件的全部放入内存,或者至少这是设计意图。但这部分代码给我带来了麻烦。你是对的,错误是和其他地方一样。不知道为什么它没有吐出qDebug,但现在这无关紧要。谢谢你的帮助。