Как выделить очень большие поля в C ++ - PullRequest
2 голосов
/ 19 ноября 2011

У меня проблема. Мне нужно выделить несколько очень больших полей с миллиардами элементов с плавающей точкой.

В данный момент я использую:

float ****spaceE;
int x,y,z;
x = y = z = 100;

spaceE = (float****)malloc(x*sizeof(int));
for (int i=0; i<x; i++)
{
    spaceE[i] = (float***)malloc(y*sizeof(int));
    for(int j=0; j<y; j++)
    {
        spaceE[i][j] = (float**)malloc(z*sizeof(int));
        for(int k=0; k<z; k++)
        {
            spaceE[i][j][k] = (float*)malloc(size[3]*sizeof(float));
        }
    }
}

Но он съедает более 2 ГБ памяти, и Windows завершает его. Мне нужно иметь несколько таких массивов и гораздо больше, есть ли лучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 19 ноября 2011

Вы должны использовать Memory Mapped Files, я думаю, что это было бы хорошим решением. http://msdn.microsoft.com/en-us/library/dd997372.aspx

2 голосов
/ 19 ноября 2011

Подумай об этом. Вы упоминаете "миллиарды элементов с плавающей точкой". Каждый float будет 4 байта. «Миллиарды» уже подразумевают, что потребуется более 4 ГБ ОЗУ ...

То, что вы пытаетесь сделать, невозможно, потому что миллиарды поплавков займут более 2 ГБ памяти.

Если вы просто пытаетесь обойти ограничение в 2 ГБ, вам нужно скомпилировать для 64-битной версии.

1 голос
/ 19 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...