2

我正在尝试读取存储为 .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";
    }
}
4

1 回答 1

1

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

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

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

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

于 2014-02-17T19:24:17.237 回答