Поиск:

Ответ в темуСоздание новой темы Создание опроса
> wincore.cpp 
:(
    Опции темы
Earnest
Дата 14.9.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



У тебя же генерируется CMemoryException? Вот его и лови.
Хотя странно, если std::vector, там другой тип исключения; точно не помню, тоже про память. Короче, выясни тип исключения и лови, в чем проблема?
Кстати, имей в виду. Вектор растет не по одному элементу а кусками. Причем, алгоритм определения размера прироста обычно довольно простой - типа удвоения текущего размера. Т.е. если тебе не хватит места всего под один элемент, вектор попытается раздуться вдвое. И может лопнуть.
Далее, перевыделение памяти происходит так: выделяем новый кусок, копируем туда старые значения, освобождаем старый. В результате - память фрагментируется! Т.е. возможен случай, когда память вроде есть, на 1000 мелких кусочков. Но вот на один большой (равный в сумме 1000 мелких) - фиг вам.
Короче, при больших аппетитах полагается сразу определиться с примерно нужным размером и заказать его сразу + небольшой запас, возможно.
Нельзя с большим вектором работать точно также как с маленьким.


--------------------
...
PM   Вверх
mrgloom
Дата 4.10.2011, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



если есть vector<vector<point>>
и я точно не знаю размер внутренних векторов и внешнего вектора,
 но например хочу под это дело выделить кусок памяти 2Гб, как это можно сделать?
PM MAIL   Вверх
Earnest
Дата 4.10.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Никак, разве что свой аллокатор писать.
Либо дизайн пересмотри.
Например, можно сделать так: выделить большой пул для всех точек в виде vector<point>, а отдельную линию хранить как <начало-конец>.
Либо как-то еще упаковать, и прописать извлечение в виде объекта. Это требует довольно много кода, но при работе с большими массивами данных обойтись стандартными контейнерами не получится.
Например, у меня в программе векторные данные хранятся в виртуальной памяти (а не в хипе), в виде упакованных блоков, без всяких указателей. Для каждого слоя есть 2 параллельных пула: массив тэгов фиксированного размера (тэг - это структура, где записан тип объекта, экстент, размер, позиция во втором пуле и некоторые доп. данные). Второй пул содержит блоки разных размеров, где хранятся собственно данные (массив координат и т.д.). На оба пула сверху навернута поддержка списка свободных блоков. Все это закрыто в наборе классов, наружу торчат только ручки типа "Разместить объект", "Удалить", "Изменить". Объект извлекается в виде пары указателей (на тэг и данные), сверху навернуты объектные обертки. Причем их два типа (2 набора): "легкие" обертки, только для чтения, зато быстро создаваемые (например, прорисовка или поиск) и полновесные классы, для редактирования/создания.

Смысл примерно такой: упакованные данные занимают намного меньше места, меньше страдают от фрагментации, легко сериализуются (всем куском); 
для чтения (рисования) достаточно inline-оберток, которые преобразуют указатели к нужному типу и ничего не стоят. А полноценный объектный доступ нужен только при редактировании отдельных объектов. Тогда точки копируются в вектора (для полилиний), модифицируются, а потом снова упаковываются.


--------------------
...
PM   Вверх
mrgloom
Дата 4.10.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



у меня проблема несколько в другом

у меня данные хранятся не в готовом для вывода виде,
 а в виде типа
1.есть описание объекта.(какая то фигура, например квадрат)
2.есть действия над объектом(переместить в точку, повернуть и т.д.)
т.е. весь файл например состоит из N таких фигур, но с разными действиями над ними, возможны вложенности одних фигур в другие.

"развернуть" все эти "заготовки" в реальные примитивы я не могу т.к. займет много памяти, приходится выцеплять частями, только те которые нужно.
в памяти я храню только описание объектов+ "куда их поставить".
я заранее простчитываю ограничивающие прямоугольники объектов и потом в цикле(когда надо отрисовать)
 накладываю на них преобразования(переместить, повернуть..) и проверяю 
1. Если ограничивающий прямоугольник пересекается или попадает в текущий видимый в программе прямоугольник.
2. если размер прямоугольника достаточно большой(чтобы не выводить маленькие).

вообщем проблема в том, что при каждой отрисовке гуляет размер вектора, который содержит данные для отрисовки,
и его размер может меняться, в теории я на каждой итерации могу оценить его размер, но это скажется по процессору.
скорее всего придется выводить "порциями", 
т.е. дошли до лимита скажем в 10к элементов- вывели, потом опять ищем.
но как этот лимит правильно определить хз, т.е. если вообще по 1 примитиву выводить лишней памяти не надо, но будет медленно.

вот код отрисовки, приходится еще выделять доп. память под временное хранилище.
vec это vector<vector<vector<point>>> , он содержит vector<vector<point>> т.е. список примитивов, которе приходят из разных тредов.
Код

//через Polypolyline
        HPEN redPen=CreatePen(PS_SOLID, 1, RGB(255,0,0));
        HGDIOBJ oldPen=SelectObject(dc,redPen);
        
        for (int k=0;k<vec.size();++k)
        {
            DWORD* lpPts=new DWORD[vec[k].size()];
            int n=0;
            for(int i=0;i<vec[k].size();++i)
            {
                lpPts[i]= vec[k][i].size();
                n+=vec[k][i].size();
            }
            CPoint* Pt= new CPoint[n];
            int c_i=0;
            for(int i=0;i<vec[k].size();++i)
            {
                for(int t=0;t<vec[k][i].size();++t)
                {
                    Pt[c_i].x= vec[k][i][t].point.x;
                    Pt[c_i].y= vec[k][i][t].point.y;
                    ++c_i;
                }
            }
            PolyPolyline(dc,Pt, lpPts, vec[k].size());
            delete[] Pt;
            delete[] lpPts;
        }




Это сообщение отредактировал(а) mrgloom - 4.10.2011, 14:45
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0680 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.