Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как виделить память под огромный вектор


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

#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ГБ, но в моем случае такого и близко нету.  

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

Добавлено через 44 секунды
Кстати, блок try/catch лучше вынести из цикла (т.е. организовать до цикла).

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

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

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

Автор: bsa 30.7.2012, 10:40
kiLLProg, http://www.viva64.com/ru/k/0036/

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

кому как не ей поддерживать?

Автор: kiLLProg 30.7.2012, 11:41
Спасибо за ссылку, ответила на все мои вопроссы. А 40255000 комбинаций недостаточно для решения задачи  smile  smile  

Автор: bsa 30.7.2012, 11:58
Цитата(kiLLProg @  30.7.2012,  12:41 Найти цитируемый пост)
Спасибо за ссылку, ответила на все мои вопроссы. А 40255000 комбинаций недостаточно для решения задачи
уверен, что ты решать задачу собрался далеко не самым оптимальным образом.

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

Да, точно. Но зато это самый быстрый и легкий способ, у которого существенный недостаток - жорево оперативы. Пока пытаюсь решить задачу так.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)