• 8559阅读
  • 8回复

这是QT的设计缺陷吗? [复制链接]

上一主题 下一主题
离线lxbin2003
 

只看楼主 倒序阅读 楼主  发表于: 2010-11-21
        QSqlTableModel query(0,db);
        query.setTable(tname);
        if(query.select())
        {
            while(query.canFetchMore())
            {
                query.fetchMore();
            }
        }
这段代码正常情况下运行没有问题,但是,当这个表的记录数很多时(比如几百万条甚至更多),程序会crash。程序占用内存量急剧上升。我分析,QSqlResult要把这些记录存在内存里,好象是使用QVector,它的上限是int型的,是内存分配失败呢,还是内存访问越界?
重载QCoreApplication::notify()可以用 try{}catch(...){}捕捉到这个错误,使程序不crash,但运行上面那段代码的函数会终止。
大家有什么好的建议吗?
如果是设计缺陷,最好有英文好的同学把这个问题反应到官方去。
离线XChinux

只看该作者 1楼 发表于: 2010-11-21
对于此类数据,太多了,还是分页查或显示吧。否则即使程序运行正常,也可能一下子就假死掉了,等很长时间没反应,最后被关闭。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hehui

只看该作者 2楼 发表于: 2010-11-21
明显是楼主自己的问题!
那代码只是官方的Demo,要用到生产环境中,要自己改的!
离线lxbin2003

只看该作者 3楼 发表于: 2010-11-21
引用第2楼hehui于2010-11-21 17:09发表的  :
明显是楼主自己的问题!
那代码只是官方的Demo,要用到生产环境中,要自己改的!

有这样的demo吗?那真是太巧了, 我写的代码竟然和demo一样。

我这是在做一个数据导出,不是为了显示数据。用QSqlQuery一样会crash.暂时没找到好办法。哪个大侠有高招呢?
离线lxbin2003

只看该作者 4楼 发表于: 2010-11-21
引用第1楼XChinux于2010-11-21 16:28发表的  :
对于此类数据,太多了,还是分页查或显示吧。否则即使程序运行正常,也可能一下子就假死掉了,等很长时间没反应,最后被关闭。


我要做表数据导出,用QSqlQuery也一样会crash.要是QT有一种数据分片类的可选项就好了,或者提供一个指针到当前记录存取,而不是一次性将记录全部读到内存中。
有好主意的,希望大家给出建议。
谢谢!
离线sbtree
只看该作者 5楼 发表于: 2010-11-22
客观的讲,这不能算是Qt的缺陷。C++本身就不进行越界检查,需要程序员自己在设计程序的时候注意的。就像你要读取一个几个G的文本文件一样,内存不够用了,当然要在算法和内存管理上自己想办法解决。总版主的分页就是一个很好的思路,也是一个普遍的思路
windows 7 + VC++2008 + Qt4.5.2
离线watera
只看该作者 6楼 发表于: 2010-11-22
在数据库海量的数据面前,再大的内存也能耗尽,所以Qt才给了个canFetchMore分次读取处理。楼主非要一次性把数据全读进来却怪Qt设计不好,真是岂有此理
离线lxbin2003

只看该作者 7楼 发表于: 2010-11-28
引用第6楼watera于2010-11-22 20:41发表的  :
在数据库海量的数据面前,再大的内存也能耗尽,所以Qt才给了个canFetchMore分次读取处理。楼主非要一次性把数据全读进来却怪Qt设计不好,真是岂有此理

呵呵,我也没非要一次全部读出来啊。
我希望它有一个接口,能够传出一个类似数据库句柄的东东,再有一个标准接口给程序员自己管理取多少数据,不需要QT封装缓存全部数据,这样就给程序员提供了更大的灵活性。
它现有的封装包做了几乎全部的事情,结果也是丧失了灵活性,迫使程序员不得不按照它的路子往下走,一般情况下没问题,但数据量大了,问题就出来了。
象我这个数据导出的问题,其实不需要它把数据全部缓存起来,要是有这样一个接口,然后通过内存映射文件,直接写到文件中去,效率和速度都比较理想,也不占用多少内存,海量数据处理也不是问题,不是吗?
当然这个也可以我自己去实现,但自己实现和QT将来的版本有可能会有冲突,而且要对每种数据库接口要做修改,工作量比较大。
我觉得这是一个缺陷,并不是它现有设计上有缺陷,而是觉得它易用性有了,却缺乏最大限度的灵活性。
希望大家不要仅局限在QT现有封装上思考问题。
谢谢大家!
[ 此帖被lxbin2003在2010-11-28 10:31重新编辑 ]
离线hehui

只看该作者 8楼 发表于: 2011-04-18
不同数据库分页方法不一样!
Qt没有提供统一的接口,可惜!
快速回复
限100 字节
 
上一个 下一个