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

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

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

Сообщений: 2130



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

Прокси?
Ресайз политика колонок/строк?
Использую QTableView с настройками по умолчанию
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


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

Можешь сам проверить - в тестовом своем примере замени:
Код
C++ (Qt)
QVariant data(const QModelIndex &index, int role) const{static int i = 0; i = qMax(i, index.row ()); return (role == Qt::DisplayRole) ? QString::number (i): QVariant();}
 
и увидишь, что там появится номер для видимых ячеек (ну, возможно, плюс еще парочка). А вот если в main сделать:

Код
C++ (Qt)
w.show();
w.resizeColumnsToContents ();
 
То увидишь максимальное количество строк.
Записан

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

Сообщений: 2130



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

Не понимаю, в чём дело...
Сделал в своем примере
Код
C++ (Qt)
   QVariant data(const QModelIndex &index, int role) const
   {
       static int i = 0;
       if (role == Qt::DisplayRole)
       {
           qDebug() << ++i;
           return i;
       }
       return QVariant();
   }
 
Да. убедился, что все именно так.
А когда вставил это же в свой проект и при открытии большого файла получил такое:
Цитировать
60
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.
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
Если что, первые 60 qDebug() относятся к другой mv
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


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

Значит проблема в чем-то еще.
Покажи свой метод data.
Записан

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

Сообщений: 2130



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

Код
C++ (Qt)
   if (!index.isValid() || (role != Qt::DisplayRole && role != Qt::EditRole))
       return QVariant();
 
   int id = index.row() * nColumns + index.column();
   int arrayOffset = id * typeSize[type] + offset;
   if (arrayOffset + typeSize[type] > dataArray->size())
       return QVariant();
 
   const char* pointer = static_cast<const char*>(dataPtr) + arrayOffset;
 
   switch (type)
   {
   case Hex:
       return QString("%1").arg(reinterpret_cast<const uchar*>(pointer)[0], 2, 16, QChar('0')).toUpper();
   ....
   return QVariant();
 

В качестве типа приходит Hex
« Последнее редактирование: Ноябрь 17, 2014, 16:56 от __Heaven__ » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


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

typeSize[type] - тут нет выхода за пределы массива?
Записан

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

Сообщений: 2130



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

нет. это хэш, который принимает перечисление.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #37 : Ноябрь 18, 2014, 10:27 »

Я бы на твоем месте начал с проверки корректности вычисления id и arrayOffset.
Записан

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

Сообщений: 2130



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

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

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #39 : Ноябрь 18, 2014, 10:34 »

А размер QByteArray какой на этом файле?
Записан

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

Сообщений: 2130



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

"rowCount. returned 33789290"

Это и есть размер массива.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #41 : Ноябрь 18, 2014, 10:50 »

32 МБ многовато. Возможно, QByteArray просто переполняется. Попробуй не закачивать файл в оперативку, а замаппить его. Или хранить только часть и подтягивать данные, если они понадобились.
Записан

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

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #42 : Ноябрь 18, 2014, 10:52 »

Еще есть предположение - QByteArray хранит данные единым блоком, поэтому, если блок не получается выделить, будет сбой. Если приложение (32 битное) даже не ест все 2 гига, есть такая вещь, как фрагментация памяти.
Записан

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

Сообщений: 2130



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

Грубо говоря нереально открыть файл размером около 250Мб и вывести в колонку его хекс значения по байтам.
Я с этим сталкивался и в другой задаче.

32 МБ многовато. Возможно, QByteArray просто переполняется. Попробуй не закачивать файл в оперативку, а замаппить его. Или хранить только часть и подтягивать данные, если они понадобились.
если я закомментирую строчку привязки модели к вьюхе, то QByteArray справляется. Даже метод QFile::readAll читает файлы до 250Мб и возвращает QByteArray.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #44 : Ноябрь 18, 2014, 10:56 »

Сейчас посмотрел в хирер qvector.h - та строчка относится к реалоку. то есть, у тебя какое-то перераспределение памяти, на котором происходит падение...

type ты откуда берешь? Что-нибудь еще изменяется в методе data?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


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