我有一个包含约1.5亿行的表的数据库。这些列只是:
id (INTEGER), value_one (INTEGER), value_two (INTEGER), value_3 (INTEGER)
我需要将所有这些数据导入QList
,但是当我运行qAllocMore: 'Requested size is too large!', file tools\qbytearray.cpp, line 73
查询时,我遇到了Qt声明SELECT
的问题。我能够在包含约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万次迭代后弹出。知道是什么导致了它吗?
答案 0 :(得分:1)
我之前的回答是无稽之谈。愚蠢的计算错误。但是,我想我现在有了解决方案。它不是一般的记忆,你缺少的,而是连续的记忆。
我尝试了以下内容:
QList<int> testlist;
for(int i = 0; i < 150000000;++i){
testlist << i << i << i << i;
}
愚蠢的小代码,没有别的,但是将4个整数150000000次放入列表中。 几秒钟后我得到了:
在抛出'std :: bad_alloc'实例后终止调用 what():std :: bad_alloc
或多或少:内存不足。
现在我更改上面的代码:
QList<int> testlist;
testList.reserve(150000000*4);
for(int i = 0; i < 150000000;++i){
testlist << i << i << i << i;
}
此代码除此之前没有任何其他功能。 QList与之前的大小完全相同。但是,我在开始循环之前保留所有内存。结果?该列表不需要增长并不断请求更多内存。有了这个版本,我完全没有问题。我得到了我的清单。