2016-02-17 3 views
2

У меня есть функция, которая работает хорошо для возрастов, которая начинаетсяЯ нахожу ли я искусственные ограничения QSqlDatabase?

QSqlDatabase 
DBUtil :: basic_open (const QString & path) 
{ 
    static int connection_num = 0; 
    static const QString CONNECTION_NAME = "Connection%1"; 

    QSqlDatabase db = QSqlDatabase :: addDatabase (
     "QSQLITE", 
     CONNECTION_NAME .arg (connection_num++)); 

    db .setDatabaseName (path); 

    if (false == db .open()) 
    { 
     // error 

Я использую это, чтобы открыть и прочитать из многих небольших баз данных SQLite, каждый из которых ~ 200k, и при открытии 1013th один он терпит неудачу с

out of memory Error opening database 

Общая нагрузка на приложение составляет ~ 200M, без гигабайта на машине.

Кажется, я нахожусь в пределе, кроме чистой памяти. Каждый объект QSqlDatabase выходит из области цикла до создания следующего, эти базы данных не все существуют одновременно, и я не вижу никаких ограничений на подключение, упомянутых в документации. Поэтому я смущен.

lsof сообщает о 200 открытых дескрипторах файлов до начала цикла и около 1200, когда он заканчивается, поэтому он выглядит так, что Qt сохраняет открытые дескрипторы после ~QSqlDatabase, но все же, если это предел, это кажется немного низким.

Любая идея, что происходит? Это современный Ubuntu.

ответ

1

Прежде всего - QSqlDatabase является одноэлементным, поэтому область не имеет значения.

Попробуйте close connection перед тем, как открыть новый.

+0

Документация для деструктора: 'Уничтожает объект и освобождает любые выделенные ресурсы. См. Также close(). 'Все еще кажется, что он протекает. – spraff

+0

Итак? Деструктор QSqlDatabase не закрывает соединения db. – RazrFalcon

Смежные вопросы