Название: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 13, 2014, 19:10 Привет, друзья!
Создал свою табличную модель. Маленькие объёмы обрабатывает хорошо. А вот с большими происходит выброс. Код На каждую функцию модели я повесил 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. Название: Re: qvector.h, line 489: Out of memory Отправлено: gil9red от Ноябрь 13, 2014, 19:32 Обычно очень много данных хранят в какой-нибудь БД и предоставляют доступ с помощью SQL model (http://qt-project.org/doc/qt-4.8/sql-model.html) :)
Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 13, 2014, 19:50 Обычно очень много данных хранят в какой-нибудь БД и предоставляют доступ с помощью SQL model (http://qt-project.org/doc/qt-4.8/sql-model.html) :) Данные хранятся в файле. Как-то менять этот файл нельзя. Можно создавать временные файлы. Конечная цель: вывести в таблицу полученный массив char. Количество колонок определяет пользователь. С базами опыта на qt не имел. Как прикрутить мою задачу к этому классу не понимаю. Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 13, 2014, 20:06 Ок. Допустим, я во временный файл запишу базу sqlite. Есть ли гарантия того, что таблица сумеет вывести мне все значения?
Название: Re: qvector.h, line 489: Out of memory Отправлено: Bepec от Ноябрь 13, 2014, 23:38 Никогда ни 1 человеку не понадобятся все данные :)
Это заблуждение. Потому надо давать маленькими частями и организовать ленивую загрузку :) Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 14, 2014, 07:57 Никогда ни 1 человеку не понадобятся все данные :) Согласен.Это заблуждение. Потому надо давать маленькими частями и организовать ленивую загрузку :) Что вы имели в виду под "давать маленькими порциями"? Это подразумевает дополнительные действия от пользователя? Название: Re: qvector.h, line 489: Out of memory Отправлено: Авварон от Ноябрь 14, 2014, 11:30 33 ляма строк - это не так много. скорее всего, проблема в том, что вы сами данные храните в векторе. Тогда надо выделить сплошной кусок памяти размера 33ляма умножить на размер структуры. Если заменить вектор структур на вектор указателей на структуры, памяти потребуется больше, но не одним куском. Можно просто заменить вектор на кулист, он уже использует указатели на данные.
Название: Re: qvector.h, line 489: Out of memory Отправлено: Johnik от Ноябрь 14, 2014, 11:48 33 ляма строк - это не так много. скорее всего, проблема в том, что вы сами данные храните в векторе. Тогда надо выделить сплошной кусок памяти размера 33ляма умножить на размер структуры. Если заменить вектор структур на вектор указателей на структуры, памяти потребуется больше, но не одним куском. Можно просто заменить вектор на кулист, он уже использует указатели на данные. Судя по сигнатуре и по наличию вектора, в качестве модели используется QStandardItemModel, а она не предназначена для большого количества данных.Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 14, 2014, 14:23 Мои данные хранятся в QByteArray.
Этот массив выводится в таблицу. По одному значению в ячейку. Если колонок в таблице сделать 5, то вылета не будет. Наследуюсь от QAbstractTableModel Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 14, 2014, 14:28 Тебе проще сделать минимальный компилябельный пример, а мы его посмотрим и поможем. ;)
Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 15, 2014, 02:19 Вот (см. аттач)
цифру можно указать и меньшую, ели добавить какую-нибудь информацию в методы data и headerData. Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 17, 2014, 09:22 Может, 990000000 слишком много? :) Убрал один 0 и все заработало. А так, падало где-то внутрях байтаррея.
Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 17, 2014, 09:27 Может, 990000000 слишком много? :) Убрал один 0 и все заработало. А так, падало где-то внутрях байтаррея. Эээх :) Придётся модифицировать свой пример, чтобы показать проблему (даже без последнего ноля)... Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 17, 2014, 09:28 Скорее всего, ибо тут эта проблема не воспроизводится.
Название: Re: qvector.h, line 489: Out of memory Отправлено: Bepec от Ноябрь 17, 2014, 10:00 Пользователю нужно максимум 900 строк на экране. Именно их вы и должны хранить в программе.
Остальное должно лежать допустим в базе данных и запрашивать по требования. Допускается так же 900 строк вверх и 900 строк вниз от имеющихся для "плавной" прокрутки. PS Вылетает скорее всего изза предела в 2 Гб для x32 программы. Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 17, 2014, 11:14 PS Вылетает скорее всего изза предела в 2 Гб для x32 программы. В точку по поводу x32. Но насчёт 2 Гб - не знаю как устроены классы, но потребление в аттаче Откомпилировал свой проект под msvc 2013 с Qt 5.3.1 opengl 64 и мой большой файл открылся без проблем. К сожалению нет возможности проверить работу при msvc x32 компиляторе. Но, думаю, что там будет то же. Повторить подобную ошибку мне не удалось в минимально компилябельном проекте. То, что я присылал немного отличается от того, что происходит в реальном проекте. В том, что я выслал происходит зависание, а в моем реальном именно выпадает ошибка. Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 17, 2014, 11:23 В 32 архитектуре процессу доступно только 2 GB оперативы. Я тоже склоняюсь, что проблема в этом.
Название: Re: qvector.h, line 489: Out of memory Отправлено: Old от Ноябрь 17, 2014, 11:28 В 32 архитектуре процессу доступно только 2 GB оперативы. Под вендой.В linux - 3 Gb. Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 17, 2014, 11:29 В 32 архитектуре процессу доступно только 2 GB оперативы. Под вендой.В linux - 3 Gb. Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 17, 2014, 11:32 Спасибо за ответы.
Немного стыдно, что не знал про 2ГБ. Я был уверен, что выделяется до 4ГБ, если приложение запустить из-под x64 Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 17, 2014, 11:47 А как отлавливать такие исключения? Куда цеплять try?
Название: Re: qvector.h, line 489: Out of memory Отправлено: Bepec от Ноябрь 17, 2014, 11:50 Под виндой это довольно запутанно и сложно :D
Имеется вроде бы блок для ловли таких вот гадостей в __try. Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 17, 2014, 11:51 ИМХО, под виндой такое сложно отловить. Нужно изначально разрабатывать, чтобы не превышать лимитов.
Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 17, 2014, 14:14 ИМХО, под виндой такое сложно отловить. Нужно изначально разрабатывать, чтобы не превышать лимитов. Так понимаю, лимиты подбираются на ощупь в моем случае. Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 17, 2014, 14:15 А еще интересно вот что!
Если я беру этот же массив и вывожу не в одну колонку, а в 3, то ошибка не выскакивает. Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 17, 2014, 14:16 ИМХО, под виндой такое сложно отловить. Нужно изначально разрабатывать, чтобы не превышать лимитов. Так понимаю, лимиты подбираются на ощупь в моем случае. Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 17, 2014, 14:50 Можешь так примерно и сделать. Пользователю не нужно видеть мульоны строк, ему нужно 100 +- 50 максимум. А дальше можно отфильтровать. Как при этом должен работать скроллбар? Если я захочу потянуть за него? Он должен просто иметь 3 положения: верх, низ и середина? Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 17, 2014, 15:00 Хм. По-идее, можно размер передавать реальный, а вот в памяти держать только нужные данные. Вьюха не запрашивает данные для ячеек, которые не видны. Исключением будет если ты пытаешься сделать ресайз колонок под содержимое - тогда делается пробег по всем значениям.
Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 17, 2014, 15:25 Хм. По-идее, можно размер передавать реальный, а вот в памяти держать только нужные данные. Вьюха не запрашивает данные для ячеек, которые не видны. Исключением будет если ты пытаешься сделать ресайз колонок под содержимое - тогда делается пробег по всем значениям. У меня 5.3 и вьюха, как мне кажется, делает пробег по всем колонкам/строкам (скрытым и отображенным). Более того, она делает это мультипоточно. Одни и теже данные я пытаюсь отобразить в 3 колонки, а затем в 1. Ничего не меняю в памяти кроме nColumns и nRows. При отображении в 3 все ок. А при отображении в 1 выброс. Также я вешал на методы data, headerData функцию qDebug(). Она вызывалась много большее число раз, чем строк имеется в отображении. Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 17, 2014, 15:27 Прокси?
Ресайз политика колонок/строк? Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 17, 2014, 15:31 Прокси? Использую QTableView с настройками по умолчаниюРесайз политика колонок/строк? Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 17, 2014, 15:33 Можешь сам проверить - в тестовом своем примере замени:
Код и увидишь, что там появится номер для видимых ячеек (ну, возможно, плюс еще парочка). А вот если в main сделать: Код То увидишь максимальное количество строк. Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 17, 2014, 16:26 Не понимаю, в чём дело...
Сделал в своем примере Код Да. убедился, что все именно так. А когда вставил это же в свой проект и при открытии большого файла получил такое: Цитировать 60 Если что, первые 60 qDebug() относятся к другой mvIn 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. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 17, 2014, 16:27 Значит проблема в чем-то еще.
Покажи свой метод data. Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 17, 2014, 16:46 Код
В качестве типа приходит Hex Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 18, 2014, 09:36 typeSize[type] - тут нет выхода за пределы массива?
Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 10:24 нет. это хэш, который принимает перечисление.
Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 18, 2014, 10:27 Я бы на твоем месте начал с проверки корректности вычисления id и arrayOffset.
Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 10:29 Да с ними всё в порядке. Маленькие файлы открываются хорошо. Этот большой, на котором вылет происходит, тоже хорошо, но только с выводом минимум в три колонки. Значения, которые выводятся в таблице я все вручную проверял.
Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 18, 2014, 10:34 А размер QByteArray какой на этом файле?
Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 10:47 Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 18, 2014, 10:50 32 МБ многовато. Возможно, QByteArray просто переполняется. Попробуй не закачивать файл в оперативку, а замаппить его. Или хранить только часть и подтягивать данные, если они понадобились.
Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 18, 2014, 10:52 Еще есть предположение - QByteArray хранит данные единым блоком, поэтому, если блок не получается выделить, будет сбой. Если приложение (32 битное) даже не ест все 2 гига, есть такая вещь, как фрагментация памяти.
Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 10:52 Грубо говоря нереально открыть файл размером около 250Мб и вывести в колонку его хекс значения по байтам.
Я с этим сталкивался и в другой задаче. 32 МБ многовато. Возможно, QByteArray просто переполняется. Попробуй не закачивать файл в оперативку, а замаппить его. Или хранить только часть и подтягивать данные, если они понадобились. если я закомментирую строчку привязки модели к вьюхе, то QByteArray справляется. Даже метод QFile::readAll читает файлы до 250Мб и возвращает QByteArray.Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 18, 2014, 10:56 Сейчас посмотрел в хирер qvector.h - та строчка относится к реалоку. то есть, у тебя какое-то перераспределение памяти, на котором происходит падение...
type ты откуда берешь? Что-нибудь еще изменяется в методе data? Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 10:56 Этот большой, на котором вылет происходит, тоже хорошо, но только с выводом минимум в три колонки. При наличии большего числа колонок (что уменьшает количество строк. в данном случае втрое) предотвращает ошибку. Это дает право сказать, что QByteArray тут не при чем Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 10:57 Сейчас посмотрел в хирер qvector.h - та строчка относится к реалоку. то есть, у тебя какое-то перераспределение памяти, на котором происходит падение... Нехватка памяти, полагаюIn file ..\..\include/QtCore/../../src/corelib/tools/qvector.h, line 489: Out of memory Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 10:58 Сама вьюха тоже, наверное, на векторах стоит
Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 18, 2014, 11:01 Попробуй еще утечки поискать памяти.
Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 11:09 Попробуй еще утечки поискать памяти. Визуально я это проделал. И моё эго подсказывает, что я очень щепетильно расходую память :) Специальным софтом ни разу не пользовался. Посоветуете бесплатную? (Работаю в QtCreator, но есть и MSVS 2013 x64) Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 18, 2014, 11:13 valgrind, но это только под Линухом.
Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 11:33 valgrind, но это только под Линухом. Жаль. Мне линукс ставить отказываются (как и vm), а дома не вариант. Мне повезло повторить ошибку в минимально компилябельном примере (см. аттач)! Всё что нужно - открыть файл свыше 120Мб (но из-за readAll не более 250). Будет точно такой же вылет. Мелкие файлы читаются на ура. Название: Re: qvector.h, line 489: Out of memory Отправлено: Johnik от Ноябрь 18, 2014, 11:41 Пробежавшись в дебаге по тестовому примеру из сообщения (http://www.prog.org.ru/index.php?topic=27927.msg203600#msg203600) (это где rowCount = 990000000),
можно увидеть, что падение происходит в функции (qbytearray.cpp): Код причем вызывается функция из (qarraydata.cpp): Код где: objectSize = sizeof(QHeaderViewPrivate::SectionItem) = 8 и capacity = 990000000 вывод 1: возможно есть баг в том, что в функцию qAllocMore передается размер в int (даже не в uint). Надо разбираться вывод 2: для отображения большого количества данных необходимо писать свой View Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 11:49 Пробежавшись в дебаге по тестовому примеру из сообщения (http://www.prog.org.ru/index.php?topic=27927.msg203600#msg203600) (это где rowCount = 990000000), можно увидеть, что падение происходит в функции (qbytearray.cpp): ...... вывод 1: возможно есть баг в том, что в функцию qAllocMore передается размер в int (даже не в uint). Надо разбираться вывод 2: для отображения большого количества данных необходимо писать свой View То зависание, скорее всего, не относится к моей проблеме. Так совпало, что мне удалось и его выявить :) qAllocMore у меня тоже один раз выскочила с ошибкой, наверное открыл файл чуть больше обычного. для отображения большого количества данных можно добавить колонки и размазать данные по ним, уменьшив количество строк, но это только для моей истиной проблемы. Как увеличение колонок и уменьшение строк поведут себя в том проекте - не проверял. В предыдущем сообщении проблема, которая реально стоит в моем проекте. Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 18, 2014, 11:52 Можно еще попробовать заюзать QAbstract* модель и вьюху.
Название: Re: qvector.h, line 489: Out of memory Отправлено: Johnik от Ноябрь 18, 2014, 11:53 То зависание, скорее всего, не относится к моей проблеме. Так совпало, что мне удалось и его выявить :) То зависание будет отрабатывать в релизной версии с отключенными ASSERTqAllocMore у меня тоже один раз выскочила с ошибкой, наверное открыл файл чуть больше обычного. Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 11:57 Можно еще попробовать заюзать QAbstract* модель и вьюху. К сожалению, я ещё малоопытен чтобы превращать QAbstract во что-то визуальное типа вьюхи. Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 18, 2014, 11:58 Попробуй для начала реализовать можель не от TableModel, а от абстрактной.
Название: Re: qvector.h, line 489: Out of memory Отправлено: Johnik от Ноябрь 18, 2014, 12:11 В предыдущем сообщении проблема, которая реально стоит в моем проекте. Все та же проблема, одним большим непрерывным куском память не выделяется.Попробуйте читать файл кусками или воспользоваться методами QFile::map, QFile::unmap в модели унаследованной от QAbstractItemModel Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 12:24 Все та же проблема, одним большим непрерывным куском память не выделяется. Под хранение данных из файла в QByteArray у меня все выделяется. Не совсем понимаю, как метод хранения данных может повлиять на представление.Если же не прикручивать модель к представлению и открыть все тот же файл, то все откроется без ошибок. В этом можно убедиться на примере из моего прошлого сообщения (http://www.prog.org.ru/index.php?topic=27927.msg203732#msg203732) Название: Re: qvector.h, line 489: Out of memory Отправлено: Пантер от Ноябрь 18, 2014, 12:25 А если потом у модели позапрашивать вручную данные?
Название: Re: qvector.h, line 489: Out of memory Отправлено: Johnik от Ноябрь 18, 2014, 12:28 Под хранение данных из файла в QByteArray у меня все выделяется. Не совсем понимаю, как метод хранения данных может повлиять на представление. Вы же писали про 250 Мб:Всё что нужно - открыть файл свыше 120Мб (но из-за readAll не более 250). Будет точно такой же вылет. Этим сообщением:Мелкие файлы читаются на ура. Попробуйте читать файл кусками или воспользоваться методами QFile::map, QFile::unmap в модели унаследованной от QAbstractItemModel я как раз о 250 и выше говорил.Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 18, 2014, 12:34 Да, говорил. Но это относится к функции file.readAll().
Поправьте меня, если я ошибаюсь, но эта функция не умеет читать большие файлы. Вместо нее мы можем читать файл порциями и добавлять в память прочитанные блоки. Название: Re: qvector.h, line 489: Out of memory Отправлено: Johnik от Ноябрь 18, 2014, 12:45 Поправьте меня, если я ошибаюсь, но эта функция не умеет читать большие файлы. Умеет, но:одним большим непрерывным куском память не выделяется. Вместо нее мы можем читать файл порциями и добавлять в память прочитанные блоки. Об этом я тоже писал.P.S. И вообще при возникновении ошибки, попробуйте до нее "дотопать" отладчиком, благо, что исходники Qt есть. Как раз много нового узнаете, и прокачаете свой скил. Название: Re: qvector.h, line 489: Out of memory Отправлено: __Heaven__ от Ноябрь 23, 2014, 11:53 Что-то заинтересовал вопрос.
Возможно ли написать свой memcpy (memcpyX86) на asm, который будет работать быстрее стандартного? Или же компиляторы и так её делают максимально эффективной? |