QFile 无法打开大文件

Posted

技术标签:

【中文标题】QFile 无法打开大文件【英文标题】:QFile cannot open large file 【发布时间】:2014-02-17 18:47:57 【问题描述】:

我正在尝试读取以 .txt 格式存储的数据文件,其中一些文件非常大 (>1 GB)。似乎每次 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";
    

【问题讨论】:

通常只使用 open() 没有问题 - 无论大小。我可能猜想您可能会遇到障碍,例如:由于另一个进程锁定了文件-就像一个想法一样,您将其作为日志文件提到。 @yshurik :日志位于一个目录中,并且没有在任何其他程序中打开(它们是几个月前生成的,我正在尝试解析和总结它们。)我的代码将适用于文件600MB 时总是失败。可能是因为在 QtCreator 中运行它,而不是作为 .exe 运行?我在输出中看不到任何 qDebug 消息,这就是为什么我认为问题出在 .open() 中。 所以你只是打开它们?您也许可以改为测试 std::ifstream? @user2672165 _file 是一个 QFile 成员变量,一个单独的插槽一次读取 100 行文件,以避免将整个大文件放入内存,或者至少这是设计意图。不过,这部分代码给我带来了麻烦。 【参考方案1】:

我认为您正在重新使用已打开的 QFile,这可能会出现问题。

reset() 的调用毫无意义——你刚刚打开了文件,它被定义重置了。

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

如果您为此编写一个最小的测试用例(一个独立的应用程序,它只打开文件,从中读取几个字节,然后关闭它),您可能会发现它不会崩溃 -问题出在代码的其他地方。

【讨论】:

你是对的,错误在其他地方。不知道为什么它没有吐出 qDebug,但这现在无关紧要。感谢您的帮助。

以上是关于QFile 无法打开大文件的主要内容,如果未能解决你的问题,请参考以下文章

QFile::copy 说“无法打开源文件进行输入”?

无法打开 QFile 进行追加/读写

Qt:如何打印 QFile?

无法打开资源文件

.sql文件太大无法打开怎么办

Qt:从项目资源中打开的 .txt 文件的 QFile 的空内容