Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как виделить память под огромный вектор, Могу виделить 741 мб максимум. А дальше? 
V
    Опции темы
kiLLProg
Дата 29.7.2012, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Для решения задачи с помощью полного перебора использую динамический массив (вектор), куда сохраняются разные комбинации. При работе консольного кода:  
Код

#include <tchar.h>
#include "conio.h"
#include <vector>
#include <iostream>

using namespace std;
//---------------------------------------------------------------------------

typedef char gameState[3][3];  

struct _vertex   
{
  gameState state; 
  unsigned __int64 prevVertex;  
  int cost;        
  int heuristics;   
  bool marked;      
};

  gameState startingState = {{5,6,3},{2,7,0},{1,4,8}};
  gameState neighbours[4];
  vector <_vertex> L;
  _vertex v;
 
int _tmain(int argc, _TCHAR* argv[])
{
  while(1)
  {
    try
    {
      L.push_back(v);
    }
    catch(...)
    {
      cout << L.size() << endl;
      break;
    }
  }

  cout << "End of work." << endl;
  getch();
  L.clear();
  return 0;
}

выделяется 741 мб памяти, больше не может, возникает ошибка.  При работе кода в визуальном приложении, выделяется всего 470 мб памяти. Почему я  не могу получить больше выделенной памяти? Хотя у меня Win 7 64 bit. Читал, что win 32 может максимум выделить 2ГБ, но в моем случае такого и близко нету.  

PM MAIL   Вверх
bsa
Дата 29.7.2012, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Сделай 64-х битный проект и ни в чем себе не отказывай.
Думаю, проблема в том, что ты увеличиваешь вектор постепенно. В итоге, память фрагментируется. Именно поэтому ты не получаешь свои заветные 1.75 ГБ (это ограничение для 32-х битных windows-программ). Чтобы проверить мое предположение сделай резервирование перед циклом: L.reserve(175 * 1024 * 1024  / 100 * 1024 / sizeof(_vertex))

Добавлено через 44 секунды
Кстати, блок try/catch лучше вынести из цикла (т.е. организовать до цикла).
PM   Вверх
kiLLProg
Дата 30.7.2012, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Получилось, спасибо.  smile  при vector <_vertex> L (40255000); - выделяется 1,577 ГБ памяти. Больше не получается. Прогаю в билдере ХЕ 2. Он 64 бита не поддерживает. А Visual Studio 2010 64 бита поддерживает?

Цитата
L.reserve(175 * 1024 * 1024  / 100 * 1024 / sizeof(_vertex))

При таком выделении памяти происходит ошибка, слишком много элементов. 

Это сообщение отредактировал(а) kiLLProg - 30.7.2012, 03:35
PM MAIL   Вверх
bsa
Дата 30.7.2012, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



kiLLProghttp://www.viva64.com/ru/k/0036/

Добавлено через 38 секунд
Цитата(kiLLProg @  30.7.2012,  04:31 Найти цитируемый пост)
А Visual Studio 2010 64 бита поддерживает?

кому как не ей поддерживать?
PM   Вверх
kiLLProg
Дата 30.7.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за ссылку, ответила на все мои вопроссы. А 40255000 комбинаций недостаточно для решения задачи  smile  smile  
PM MAIL   Вверх
bsa
Дата 30.7.2012, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(kiLLProg @  30.7.2012,  12:41 Найти цитируемый пост)
Спасибо за ссылку, ответила на все мои вопроссы. А 40255000 комбинаций недостаточно для решения задачи
уверен, что ты решать задачу собрался далеко не самым оптимальным образом.
PM   Вверх
kiLLProg
Дата 30.7.2012, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
уверен, что ты решать задачу собрался далеко не самым оптимальным образом.

Да, точно. Но зато это самый быстрый и легкий способ, у которого существенный недостаток - жорево оперативы. Пока пытаюсь решить задачу так.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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