Russian Qt Forum
Ноябрь 23, 2024, 03:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 ... 5   Вниз
  Печать  
Автор Тема: qvector.h, line 489: Out of memory  (Прочитано 30711 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« : Ноябрь 13, 2014, 19:10 »

Привет, друзья!
Создал свою табличную модель. Маленькие объёмы обрабатывает хорошо. А вот с большими происходит выброс.
Код
C++ (Qt)
   tbl = new TableModel(this);
   tbl->setColumnCount(ui->columnsSpn->value());
   tbl->setInputData(rawData);     //QByteArray
   tbl->setBeginAddress(rawPos);
   ui->rawTbl->setModel(tbl);
 
На каждую функцию модели я повесил qDebug
Подскажите, пожалуйста, почему у меня выскакивает ошибка. Точнее, какие пределы по строкам в таблице? Или как оптимизировать таблицу.
Цитировать
constructor
setColumnCount
"setInputData. dataSize 33789290"
setColumnCount
setBeginAddress
"rowCount. returned 33789290"
"columnCount. returned 1"
"rowCount. returned 33789290"
"columnCount. returned 1"
"rowCount. returned 33789290"
"columnCount. returned 1"
"rowCount. returned 33789290"
In file ..\..\include/QtCore/../../src/corelib/tools/qvector.h, line 489: Out of memory
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Ноябрь 13, 2014, 19:32 »

Обычно очень много данных хранят в какой-нибудь БД и предоставляют доступ с помощью SQL model Улыбающийся
Записан

__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Ноябрь 13, 2014, 19:50 »

Обычно очень много данных хранят в какой-нибудь БД и предоставляют доступ с помощью SQL model Улыбающийся

Данные хранятся в файле. Как-то менять этот файл нельзя. Можно создавать временные файлы.
Конечная цель: вывести в таблицу полученный массив char. Количество колонок определяет пользователь.
С базами опыта на qt не имел. Как прикрутить мою задачу к этому классу не понимаю.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Ноябрь 13, 2014, 20:06 »

Ок. Допустим, я во временный файл запишу базу sqlite. Есть ли гарантия того, что таблица сумеет вывести мне все значения?
Записан
Bepec
Гость
« Ответ #4 : Ноябрь 13, 2014, 23:38 »

Никогда ни 1 человеку не понадобятся все данные Улыбающийся
Это заблуждение. Потому надо давать маленькими частями и организовать ленивую загрузку Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Ноябрь 14, 2014, 07:57 »

Никогда ни 1 человеку не понадобятся все данные Улыбающийся
Это заблуждение. Потому надо давать маленькими частями и организовать ленивую загрузку Улыбающийся
Согласен.
Что вы имели в виду под "давать маленькими порциями"? Это подразумевает дополнительные действия от пользователя?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Ноябрь 14, 2014, 11:30 »

33 ляма строк - это не так много. скорее всего, проблема в том, что вы сами данные храните в векторе. Тогда надо выделить сплошной кусок памяти размера 33ляма умножить на размер структуры. Если заменить вектор структур на вектор указателей на структуры, памяти потребуется больше, но не одним куском. Можно просто заменить вектор на кулист, он уже использует указатели на данные.
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #7 : Ноябрь 14, 2014, 11:48 »

33 ляма строк - это не так много. скорее всего, проблема в том, что вы сами данные храните в векторе. Тогда надо выделить сплошной кусок памяти размера 33ляма умножить на размер структуры. Если заменить вектор структур на вектор указателей на структуры, памяти потребуется больше, но не одним куском. Можно просто заменить вектор на кулист, он уже использует указатели на данные.
Судя по сигнатуре и по наличию вектора, в качестве модели используется QStandardItemModel, а она не предназначена для большого количества данных.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Ноябрь 14, 2014, 14:23 »

Мои данные хранятся в QByteArray.
Этот массив выводится в таблицу. По одному значению в ячейку.
Если колонок в таблице сделать 5, то вылета не будет.
Наследуюсь от QAbstractTableModel
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Ноябрь 14, 2014, 14:28 »

Тебе проще сделать минимальный компилябельный пример, а мы его посмотрим и поможем. Подмигивающий
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Ноябрь 15, 2014, 02:19 »

Вот (см. аттач)
цифру можно указать и меньшую, ели добавить какую-нибудь информацию в методы data и headerData.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Ноябрь 17, 2014, 09:22 »

Может, 990000000 слишком много? Улыбающийся Убрал один 0 и все заработало. А так, падало где-то внутрях байтаррея.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #12 : Ноябрь 17, 2014, 09:27 »

Может, 990000000 слишком много? Улыбающийся Убрал один 0 и все заработало. А так, падало где-то внутрях байтаррея.

Эээх Улыбающийся
Придётся модифицировать свой пример, чтобы показать проблему (даже без последнего ноля)...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #13 : Ноябрь 17, 2014, 09:28 »

Скорее всего, ибо тут эта проблема не воспроизводится.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #14 : Ноябрь 17, 2014, 10:00 »

Пользователю нужно максимум 900 строк на экране. Именно их вы и должны хранить в программе.
Остальное должно лежать допустим в базе данных и запрашивать по требования.

Допускается так же 900 строк вверх и 900 строк вниз от имеющихся для "плавной" прокрутки.

PS Вылетает скорее всего изза предела в 2 Гб для x32 программы.
Записан
Страниц: [1] 2 3 ... 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 23.