如何从Qt中的txt文件加载大数据

时间:2017-10-15 09:53:43

标签: c++ qt boost

我需要尽快加载一个包含5百万个数据的txt文件(即字符串,每个单词,每个单词9个字符,由新行分隔。)到QVector。代码现在正常工作,但是,如果用户点击上传,则应用程序需要3-5秒才能加载此数据以进行进一步操作。我需要减少加载这些数据的时间。处理这个问题的正确方法是什么?我很好用Qt / STL / Boost。我更喜欢Qt。我用于此任务的代码是Qt文档中建议的代码

<main>': undefined method `save_to_csv' for [["user1"], ["user2"], etc]

2 个答案:

答案 0 :(得分:2)

您的示例代码实际上隐式地解码。它从文件中读取8位编码文本,并将其转换为QString,内部使用16位Unicode编码。

如果不使用QTextStream,您可能会直接使用普通QFile,并使用此readLine方法读取表单,并返回{{1换句话说,“原始”文件内容。这样做的目的是避免为整个文件内容创建QByteArray个对象。

如果你有500万行,那么如果你将它们存储在QString而不是QByteArray的内存中,你也可以节省大量内存。仅当您实际要在GUI中显示文本时才转换为QString

注意:注意文本编码!任何文件中的任何文本都始终编码,即使特别讲英语的人可能没有意识到它。最简单的编码是7位ASCII,实际上很多纯英文文本都是这样,几乎每个包含UTF-8的编码实际上都是7位ASCII的超集,因此几乎任何编码都可以加载7位ASCII文件。但是对于多语言文本,您需要知道文件使用的编码,或者您将获得重音和其他特殊字符,例如ÄÅÁÀÃ,错误。 UTF8是唯一可以存储“所有内容”的编码,其他编码如Latin1是专为特定语言系列设计的。

注2:QString实际上对应于QByteArray用于大多数目的。 std::string更像QString。不是说这些是相同的1:1匹配,但它有助于将它们视为相似。

答案 1 :(得分:1)

试试这个:

我测试了它并在 2.1秒中读取文件。

reserve向量,然后阅读并使用QElapsedTimer来获取阅读时间。

void MainWindow::readDataText()
{
    QString filePath = "F:\\Qt\\Big_File\\Big_File\\data.txt";
    QVector<qint64> *vector = new QVector<qint64>;
    vector->reserve(5000000);
    QElapsedTimer timer;
    QFile readFile(filePath);
    if(!readFile.open(QFile::ReadOnly | QFile::Text))
    {
        // Can't Open File.
    }
    else
    {
        QByteArray data;
        timer.start();
        for (int var = 0; var < 5000000; ++var)
        {
            vector->insert(var, (readFile.readLine()).toInt());
        }
        qint64 time = timer.elapsed();
        ui->txtReadTimeText->setText(QString::number(time));
    }
    readFile.close();
}

如果您的文件是二进制文件,也会更好。

另一个解决方案是使用readAll()函数并在 116毫秒中读取文件,然后像这样处理(由'\ n'分割)数据:

void MainWindow::readDataText()
{
    QString filePath = "D:\\ProjectTest\\ProjectTest\\data.txt";
    QByteArray data;
    data.reserve(5000000);

    QElapsedTimer timer;
    QFile readFile(filePath);
    if(!readFile.open(QFile::ReadOnly | QFile::Text))
    {
        // Can't Open File.
    }
    else
    {
        timer.start();
        data = readFile.readAll();
        qint64 time = timer.elapsed();
        ui->txtReadTimeText->setText(QString::number(time));
    }
    readFile.close();
}