2013-09-01 4 views
0

У меня есть база данных с таблицей, содержащей ~ 150 миллионов строк. Столбцы просто:Large Qt Sqlite SELECT Statement

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

Я должен импортировать все эти данные в QList, но я бег в проблему, где Qt является утверждающим qAllocMore: 'Requested size is too large!', file tools\qbytearray.cpp, line 73, когда я бег SELECT запроса. Я могу запустить тот же код в таблице, содержащей ~ 7 миллионов записей, и работает без ошибок.

Это мое 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, но утверждают, выскакивает после ~ 16 миллионов итераций. Любая идея, что его вызывает?

+0

Похоже, что у вас заканчивается память, вы на 32-битной ОС? и сколько у вас RAM? – OneOfOne

+0

64-разрядная машина и 64-разрядный исполняемый файл. Я работаю с 8 гигабайтами оперативной памяти. Я использую еще 8 концертов с файлом подкачки. Я работаю в Windows 7. –

+0

Я не знаю, пытаетесь ли вы отображать эти данные в каком-то U/I, но если так, то я бы сказал, что это ошибка дизайна. Вместо этого вы должны использовать какой-то механизм подкачки. – OldProgrammer

ответ

1

Мой предыдущий ответ был вздор. Глупый расчет ошибок. Однако, я думаю, теперь у меня есть решение. Это не память в целом, чего вам не хватает, а последовательная память.

Я попытался следующие:

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

Глупый маленький код, ничего не делает, но поставить 4 INTS 150000000 раз в список. я получаю через несколько секунд:

Terminate вызывается после метания экземпляра 'станд :: bad_alloc'
, что(): станд :: bad_alloc

Более или менее: Из памяти ,

Теперь я изменить код выше:

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

Этот код не делает ничего другого, чем предыдущий. QList имеет тот же размер, что и раньше. Тем не менее, я сохраняю всю память до начала цикла. Результат? Этот список не должен расти и постоянно запрашивать больше памяти. С этой версией у меня не было проблем. Я получил свой список.

+0

Удивительный! Я дам ему выстрел :) –