Qt 读取文件并映射到 QVector 非常慢(崩溃)

Posted

技术标签:

【中文标题】Qt 读取文件并映射到 QVector 非常慢(崩溃)【英文标题】:Qt reading file and mapping to QVector very slow (crashes) 【发布时间】:2015-07-17 02:51:00 【问题描述】:

所以我要做的是读取文件并将其映射到二维 QVector。到目前为止,这是我的代码

void dataModel::parseFileByLines()

QVector<QVector<QString> > dataSet;
lastError = "";
QRegExp reg(fileDelimiter);
QFile inFile(inputFile);
if (inFile.open(QIODevice::ReadOnly))
    QTextStream fread(&inFile);
    long totalSize = inFile.size();
    QString line;
    while(!fread.atEnd())
        line = fread.readLine();  
        dataSet.append(line.split(reg,QString::KeepEmptyParts).toVector());
   
else
   lastError = "Could not open "+inputFile+" for reading";


我的问题是,当处理 1000,000 行或更多行时,程序崩溃并显示一条消息“此应用程序已请求运行时以不寻常的方式终止它”。有没有更有效的方法可以实现我的目标?如果有怎么办?

输入文件可能是这样的格式

ID、姓名、年龄、性别...等

1,山姆,12

...

...

1000000

非常感谢任何帮助或建议

【问题讨论】:

从这里开始的下一步是使用调试器运行它,以查找它崩溃的行并获取堆栈跟踪。 @MrEricSir 谢谢,但我已经知道瓶颈是dataSet.append()。但这是我的问题,我是否使用了错误的 Qt 容器? Qt 提供了另一种更有效的方法来实现我想要的吗?通过研究,我找不到与这种情况有关的任何东西。 视情况而定,目前尚不清楚您从这一功能中的目标是什么。您能否详细说明您要完成的工作? 一个快速的改进是最初在向量上调用reserve()。在某些时候,它只是无法分配足够的连续内存,这可能就是崩溃的来源(使用调试器)。像处理一个 1M 行的文本文件,你可能还想移到一个单独的线程。 @MrEricSir 所以我有一个读取文本文件的应用程序。此文本文件可以用逗号、制表符或竖线分隔。我想将此文本文件映射到 QTableView。所以上面的函数应该做映射部分。 dataSet 是一个二维向量,表示我的 QAbstractTableModel 实现中使用的数据结构。此函数也在单独的线程上运行 【参考方案1】:

我已经在我的电脑上测试了这个 (QList) 版本,它的运行速度比 QVector 版本快得多,我也相信它不会崩溃。

void parseFileByLines(QString inputFile)

    QList<QList<QString> > dataSet;
    QString lastError = "";
    QFile inFile(inputFile);
    if (inFile.open(QIODevice::ReadOnly))
        QTextStream fread(&inFile);
        long totalSize = inFile.size();
        QString line;
        while(!fread.atEnd())
            line = fread.readLine();
            QList<QString> record = line.split('\t',QString::KeepEmptyParts);
            dataSet.append(record);
        
    else
        lastError = "Could not open "+inputFile+" for reading";
    

【讨论】:

使用 QList 而不是 QVector 只会避免 QVector 进行内存重新分配,但最终需要相同数量的内存。对于非常大的数据集,我会使用 sqlite 数据库,或者如果你想要一个基于缓存的存储服务器,你可以尝试使用 redis 服务器。在内存中存储如此大量的数据并不是一个好主意,尤其是在没有预分配的情况下。 速度快得多并且不会崩溃,所以这可能是由于内存重新分配因素造成的? 是的,不同的速度是由于重新分配,崩溃我不确定但可能是分配失败,如果你想确定你可以尝试添加尝试,除了分配周围并抓住一个可能的失败,最后请记住,使用 qlist,您的数据现在写入速度更快,但随机读取速度较慢。

以上是关于Qt 读取文件并映射到 QVector 非常慢(崩溃)的主要内容,如果未能解决你的问题,请参考以下文章

初始化并访问 <QVector< QVector<int> > QT5

Android从内部存储读取文件非常慢

Qt-读取文本导出word

Qt5 Visual Studio 2012 插件不允许调试到 QStack/QVector

Qt无法调试Qvector

qvector4dw()是啥