大型Qt Sqlite SELECT语句
Large Qt Sqlite SELECT Statement
我有一个数据库,其中有一个包含约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的大小与以前完全相同。但是,在开始循环之前,我会保留所有内存。结果如何?该列表不需要增长,也不需要不断请求更多内存。有了这个版本,我一点问题都没有。我拿到了我的单子。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 我似乎对if/else的基本语句有问题:/
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- golang select语句是如何实现的
- 使用 sqlite select 语句引发异常
- 大型Qt Sqlite SELECT语句
- 有没有办法从这个sql语句和逻辑中删除select count(*)
- 运行select语句时,Firebird ODBC驱动程序数据被截断
- 在 bindValue(...) 函数中使用 select 语句 - Qt & SQLite