Как скомпилировать программу, чтобы она могла использовать> 4 ГБ памяти на 32-битном Linux? - PullRequest
4 голосов
/ 11 апреля 2011

Весь код написан на C, C ++ и Fortran.Можно ли заставить его использовать более 4 ГБ памяти.Теперь он всегда падает, когда достигает 3 ГБ памяти.

Если это возможно, как настроить параметры компиляции (или настроить флаги)?

Мы можем использовать gcc, g ++, ...или компиляторы Intel

наша ОС: Fedora 12 x32

cat /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm tpr_shadow vnmi flexpriority
bogomips : 5319.72
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual

Ответы [ 4 ]

8 голосов
/ 11 апреля 2011

К сожалению, вы достигли предела, который

R> 2^32
[1] 4294967296

это ваш предел 4 ГБ. Таким образом, вы просто не можете индексировать за для одного приложения , независимо от того, какая ОС.

Это одна из причин, по которой многие из нас перешли на 64-битные версии наших ОС. Linux поддерживает это с конца 1990-х годов. Просто переключитесь на FC (или Ubuntu или ...) в 64-битной версии.

Одной из возможных альтернатив является установка большего количества ОЗУ (которое будет обрабатывать Linux) и сегментирование вашей задачи по нескольким экземплярам приложения, эффективно выполняя ее параллельно. Но это может не стоить хлопот ...

3 голосов
/ 11 апреля 2011

Я полагаю, что если вы поместите файл в файловую систему tmpfs (или hugetlbfs) и в свою программу отобразите небольшие (1–2 ГБ) куски за раз, вы можете работать с более чем 4 ГБ данных одновременно .

Операции с картами не такие быстрые, поэтому вы получите удар по производительности, если перепрыгнете свою память слишком случайно.

2 голосов
/ 11 апреля 2011

Необходимо разбить его рабочий набор на порции размером менее 3 ГБ и обрабатывать каждый порцию в отдельном процессе.Соедините процессы с помощью каналов или сокетов.

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

1 голос
/ 11 апреля 2011

32-разрядные целые числа не могут считать больше 4 Гб:

http://www.linuxquestions.org/questions/linux-general-1/32-bit-os-and-4gb-memory-limit-707762/

...