Сколько данных может быть неправильно размещено за раз? какой предел в современных ОС, таких как Linux? - PullRequest
2 голосов
/ 18 октября 2010

Сколько данных может быть неправильно размещено и как определяется предел?Я пишу алгоритм на C, который в основном использует многократно некоторые данные, хранящиеся в массивах.Моя идея состоит в том, чтобы сохранить это в динамически распределяемых массивах, но я не уверен, возможно ли иметь такие неправильные значения.

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

Что вы думаете о целесообразности такого подхода?

Спасибо, Мир

Ответы [ 4 ]

3 голосов
/ 18 октября 2010

Сколько памяти malloc() может выделить, зависит от:

  • Сколько памяти ваша программа может адресовать напрямую
  • Сколько физической памяти доступно
  • Какдоступно много пространства подкачки

В современной 32-разрядной системе с плоской памятью ваша программа может адресовать 4 гигабайта, но часть адресного пространства (обычно 2 гигабайта, иногда 1 гигабайт)зарезервировано для ядра.Таким образом, как правило, вы должны иметь возможность выделять почти два гигабайта одновременно, при условии, что у вас есть физическая память и пространство подкачки для ее резервного копирования.

В 64-разрядной системе с 64-разрядной системойВ 64-разрядной операционной системе и 64-разрядной программе адресная память практически не ограничена.

200 массивов по 2048 байт каждый составляет всего 400 КБ, что должно помещаться в кэш (даже на смартфоне).

3 голосов
/ 18 октября 2010

32-битная ОС имеет ограничение 4 ГБ, обычно некоторые (до половины на win32) зарезервированы для операционной системы - отображение адресного пространства памяти графической карты и т. Д.

Linux поддерживает 64 ГБ адресного пространства (использование Intel 36-битной PAE) в 32-битных версиях.
РЕДАКТИРОВАТЬ: хотя каждый процесс ограничен 4 ГБ
Основная проблема с выделением большого объема памяти заключается в том, что если вы хотите, чтобы она была заблокирована в ОЗУ, то вам, очевидно, нужно многооперативной памятиИли, если вам нужно, чтобы все было непрерывно - гораздо проще получить 4 * 1 ГБ порции памяти, чем один 4 ГБ порцию, и ничего больше не мешает.

Обычный подход состоит в том, чтобы выделить всю необходимую память.в начале программы, так что вы можете быть уверены, что, если приложение не будет возможно, оно сразу же выйдет из строя, а не когда выполнит 90% работы.
Не запускайте другие приложения, интенсивно использующие память, нав то же время.
Есть также несколько флагов, которые вы можете использовать, чтобы указать ядру, что это приложение должно получить приоритет в памяти или держать память заблокированной в ОЗУ - извините, это слишком долго, так как я делал HPC на Linux, и явероятно, устарел в современных ядрах.

1 голос
/ 18 октября 2010

Я думаю, что в большинстве современных (64-битных) систем вы можете выделить 4 ГБ за раз с помощью вызова malloc( size_t ), если доступно столько памяти.Насколько велика каждая из этих «сложных данных»?если они имеют размер 256 байт, то вам нужно всего лишь выделить 100 МБ.

256bytes × 200 arrays × 2048 entries = 104857600bytes  
104857600 bytes / 1024 / 1024 = 100MB.

Так что для каждого 4096 байт по-прежнему всего 1600 МБ или GB 1,6 ГБ, так что это возможно на большинстве систем сегодняЧетырехлетний ноутбук получил 3 ГБ встроенной памяти.Иногда я выполняю манипуляции с изображениями с помощью GIMP, и это занимает более 2 ГБ памяти.

0 голосов
/ 18 октября 2010

В некоторых реализациях malloc() регионы фактически не поддерживаются памятью до тех пор, пока они действительно не привыкнут, так что теоретически вы можете работать вечно (хотя на практике, конечно, список выделенных областей, назначенных вашему процессу в ядре)занимает много места, так что вы можете обнаружить, что вы можете malloc() звонить только несколько миллионов раз, даже если это никогда не даст вам памяти).Это называется «оптимистичное распределение» и является стратегией, используемой в Linux (именно поэтому он имеет убийцу OOM, когда он был чрезмерно оптимистичным).

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