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

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

Страниц: [1] 2 3 ... 5   Вниз
  Печать  
Автор Тема: qvector.h, line 489: Out of memory  (Прочитано 32136 раз)
__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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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

Сообщений: 5877


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


Просмотр профиля 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.062 секунд. Запросов: 23.