2016-11-28 3 views
0

Вот моя конечная цель:Как объявить огромный массив постоянного

Я хочу, чтобы иметь возможность генерировать все возможные изображения, доступные для данного размера в любой возможной глубине цвета.

В некотором смысле это не очень сложно. Мне в основном приходится выполнять итерацию на каждом пикселе матрицы/матрицы, где изображение представлено и повторять снова для каждого возможного значения для данного пикселя.

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

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

Теперь проблема:

Поскольку я сильно использовать каждый разные значения пикселя на каждой итерации я хочу установить ее на глобальную константу, которая будет содержать все возможные значения одного. Так что это что-то вроде массива 16M-массива unsigned char [3]. Это дает что-то вроде 50 МБ ОЗУ, используемого только для него, поэтому не слишком громадное управление и, прежде всего, набор постоянных значений, которые не нужно генерировать «на лету» и приятный (я думаю?) Выигрыш времени и эффективности, поскольку данные используются постоянно.

Проблема заключается в том, что этот массив огромен, только если он набрал требуемый кусок пространства (~ 640 МБ), и я задаюсь вопросом, является ли размер этого файла проблемой, когда я пытаюсь скомпилировать приложение при его вызове , Я получаю сообщение об ошибке с из памяти, выделяющей байты xxxx, есть ли лучший способ получить эту настройку массива? Или идея не так хороша, как я себе представляю, и есть лучший способ сделать то, что я хочу?

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

+6

Возможно, вы должны спросить себя: «Неужели мне нужен массив, который большой, или есть лучший способ?» –

+1

Проверьте 'mmap'. Он позволяет отображать содержимое существующего файла в память. Вы можете сохранить свои значения в 64-мегабайтном файле и отобразить его в память при запуске программы. – Marian

+0

@JohnnyMopp У меня есть каждое из значений thets несколько раз во время выполнения приложения, я не _need_, чтобы иметь его, и могу просто выбрать их, когда это необходимо, из одного или нескольких циклов или что-то в этом роде, но для эффективности, если это возможно уже в памяти, это еще лучше для меня – Kane

ответ

0

Вам не нужен такой массив, особенно если кажется, что вы хотите сохранить в pixel_matrix[i] наименее значимые три байта i.

Из фрагмента вы публикуемые, значение pixel_matrix[i] может быть получен следующим образом:

pixel_matrix[i][0] = (i >> 16) & 0xFF; 
pixel_matrix[i][1] = (i >> 8) & 0xFF; 
pixel_matrix[i][2] = i & 0xFF; 

Формула выше делает хранение pixel_matrix бесполезно.

+1

Внесите формулы в (один или три) макросы или встроенные функции, и вы можете использовать 'pixel_matrix (i, 1)' или 'pixel_GREEN (i)'. –

Смежные вопросы