大型Qt Sqlite SELECT语句

Large Qt Sqlite SELECT Statement

本文关键字:语句 SELECT Sqlite Qt 大型      更新时间:2023-10-16

我有一个数据库,其中有一个包含约1.5亿行的表。列只是:

id (INTEGER), value_one (INTEGER), value_two (INTEGER), value_3 (INTEGER)

我需要将所有这些数据导入到QList中,但我遇到了一个问题,即当我运行SELECT查询时,Qt正在断言qAllocMore: 'Requested size is too large!', file toolsqbytearray.cpp, line 73。我可以在一个包含大约700万个条目的表上运行相同的代码,而且它可以正常工作。

这是我的SELECT声明:

 bool e = query.exec("SELECT * FROM DocumentTerms");
 if (!e) {
     qWarning() << __FUNCTION__ << "tError: " << query.lastError().text();
 }
 while (query.next()) {
     int docId = query.value(1).toInt();
     int termId = query.value(2).toInt();
     int frequency = query.value(3).toInt();
     //store it in a QHash<int, QPair<int, int>>
 }

它看起来像是在query.next循环中迭代,但断言在大约1600万次迭代后弹出。知道是什么原因吗?

我以前的回答是胡说八道。愚蠢的计算错误。然而,我想我现在有了解决方案。这不是一般的记忆,你所缺少的,而是连续的记忆。

我尝试过以下几种:

QList<int> testlist;
for(int i = 0; i < 150000000;++i){
    testlist << i << i << i << i;
}

愚蠢的小代码,什么都不做,只在列表中放入4 int 150000000次。几秒钟后我得到:

在抛出"std::bad_alloc"的实例后调用terminate
what():std::bad_alloc

或多或少:内存不足。

现在我更改上面的代码:

QList<int> testlist;
testList.reserve(150000000*4);
for(int i = 0; i < 150000000;++i){
    testlist << i << i << i << i;
}

这个代码只做前面的代码。QList的大小与以前完全相同。但是,在开始循环之前,我会保留所有内存。结果如何?该列表不需要增长,也不需要不断请求更多内存。有了这个版本,我一点问题都没有。我拿到了我的单子。