• 15297阅读
  • 11回复

QT操作大文本文件的效率 [复制链接]

上一主题 下一主题
离线icevi
 

只看楼主 正序阅读 楼主  发表于: 2007-03-30
— 本帖被 XChinux 执行加亮操作(2008-07-19) —
做了一个小程序,打开文本文件,然后在QTextEdit中显示。但若文件很大,比如有1M以上的话,打开就很慢。(其实1M以下也有些慢,但速度尚可接受)。
我试过启一个线程来从文件里一行一行地读,速度更慢。
分析了一下,readAll()并不算很慢,但将读到的内容insert到QTextEdit中去感觉挺慢的。

大家有没有什么意见和建议啊~

我写的代码是这样:
QString fileName = "";

    fileName = QFileDialog::getOpenFileName(this,
        tr("Open File"), "", "LOG Files (*.txt *.log)");

    if (!fileName.isEmpty()) {
        myEditor->TE_Content->clear();
        CurrentFileName=fileName;

        //直接打开文件
        qDebug() << "before open file:" << QTime::currentTime();
        QFile file(fileName);
        if (!file.open(QFile::ReadOnly | QFile::Text)) {
            QMessageBox::warning(this, tr("Log Reader"),
                tr("Cannot read file %1:\n%2.")
                .arg(fileName)
                .arg(file.errorString()));
            return ;
        }
        QTextStream in(&file);
        QApplication::setOverrideCursor(Qt::WaitCursor);
        this->myEditor->TE_Content->setPlainText(in.readAll());
        QApplication::restoreOverrideCursor();

        qDebug() << "end open file:" << QTime::currentTime();

    }else
    {
        qDebug() << "select file first!";
    }
[ 此贴被XChinux在2008-07-19 21:38重新编辑 ]
====================
www.bilive.com
BiForm BiReader BiChat
最爱QT和PYTHON
====================
离线左手
只看该作者 11楼 发表于: 2009-04-28
引用楼主icevi于2007-03-30 18:35发表的 QT操作大文本文件的效率 :
做了一个小程序,打开文本文件,然后在QTextEdit中显示。但若文件很大,比如有1M以上的话,打开就很慢。(其实1M以下也有些慢,但速度尚可接受)。
我试过启一个线程来从文件里一行一行地读,速度更慢。
分析了一下,readAll()并不算很慢,但将读到的内容insert到QTextEdit中去感觉挺慢的。
大家有没有什么意见和建议啊~
.......




同感!!!太慢了。。。。,我打开的文件只有800~900K也要好一会儿
离线gonboy

只看该作者 10楼 发表于: 2009-04-11
insert 效率低下
离线sbtree
只看该作者 9楼 发表于: 2008-10-31
有没有直接对文件进行插入的操作啊
windows 7 + VC++2008 + Qt4.5.2
离线aaniao999

只看该作者 8楼 发表于: 2007-04-20
我上面说的办法有希望了,今天发现个函数
QFile::seek(qint64 pos)
配合QByteArray QFile::read ( qint64 maxSize )应该没问题了
离线icevi

只看该作者 7楼 发表于: 2007-04-19
谢谢htyoung,用QScintilla这个类确实快了很多。
回头有时间试一下aaniao999 的方法看看。
其实主要不是读取的速度慢,是QTextEdit太慢了。内容多了以后就慢得无法忍受。
分块读入也试过,效果也不是很好。
====================
www.bilive.com
BiForm BiReader BiChat
最爱QT和PYTHON
====================
离线aaniao999

只看该作者 6楼 发表于: 2007-04-18
对了,还有一点我没说,其实QT打开String的文件很快的,用ReadLine的方式打开的,文件的内容和WINDOWS下的游戏配置文件格式一样的那种,14 MB我在LINUX下面打开就1秒吧,
不知道是硬盘本来读取就比写入快,
还是以ReadLine读取string类型的文件快,
还是LINUX下的TYPE 8E文件系统就是快?(我用的是FC6)
离线aaniao999

只看该作者 5楼 发表于: 2007-04-18
我想啊,他可能只读第1页的内容吧,要显示的时候满一页就够了,其他也是浪费时间啊,等到换行,或者拖动scroll area的时候,就再计算从什么地方开始显示吧,或者弄个新的线成专门读,不一定等读完再显示嘛
但是coolEdit我很想不通,他不管混合轨道还是保存文件都快到吐血了,要知道,混合轨道=16进制处了文件头全变了啊,他要3秒的话,我自己写的起码要3-4MIN,这个麻烦了,就算除以2也没他快啊
大家有什么想法吗?
快来讨论下
离线hehui

只看该作者 4楼 发表于: 2007-04-16
去看看去!
离线htyoung

只看该作者 3楼 发表于: 2007-04-02
可以试试QScintilla这个类,http://www.riverbankcomputing.co.uk/qscintilla/index.php

打开大文件相当快,和Nedit有的一拼,我用这个edit控件 经常打开几十M的log文件。
***
QT5
***
离线qoozone1234

只看该作者 2楼 发表于: 2007-03-31
今天下了一个notepad2
发现打开速度非常快。
估计,是采用了分页显示处理。
并不是一个像qtextedit那样慢.1M的几乎瞬间打开了。
看来得看看this->myEditor->TE_Content->setPlainText(in.readAll());
的原代码.了。
不过,我想一个问题,他是不是使用汇编进行优化了?!
这个很重要。
离线qoozone1234

只看该作者 1楼 发表于: 2007-03-31
呵呵,你看看记事本打开1M是什么速度.
呵呵,基本就是这样的。
快速回复
限100 字节
 
上一个 下一个