如何编译程序使其能够在32位Linux上使用> 4GB内存?

时间:2011-04-11 18:55:39

标签: c++ c linux fedora

整个代码是用C,C ++和Fortran编写的。 是否可以使用超过4GB的内存。 现在它在达到3GB内存时总是崩溃。

如果可能,如何设置编译选项(或配置标志)?

我们可以使用gcc,g ++,...或英特尔编译器

我们的操作系统: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 个答案:

答案 0 :(得分:8)

不幸的是,你达到了

的极限
R> 2^32
[1] 4294967296

这是你的4 gb限制。因此,无论操作系统是什么,您都无法在之外为单个应用程序编制索引。

这是我们许多人切换到64位版操作系统的原因之一。自20世纪90年代末以来,Linux就支持这一点只需在64位切换到FC(或Ubuntu或...)。

一种可能的替代方法是安装更多RAM(Linux将处理)并在应用程序的多个实例上对您的任务进行分段,从而有效地并行运行它。但那可能不值得这么麻烦......

答案 1 :(得分:3)

我相信如果你把文件放在tmpfs文件系统(或hugetlbfs)中,并且你的程序映射一次只有一小块(1 - 2 GB),你可以同时使用超过4 GB的数据

地图操作并不是那么快,所以如果你太随意地跳过你的记忆,你会受到性能影响。

答案 2 :(得分:2)

您需要将其工作集划分为< 3 GB,并在单独的进程中处理每个块。通过管道或套接字连接流程。

这非常类似于将其开发到网络/群集应用程序中,如果您想要可伸缩性,这可能不是一个坏主意。

答案 3 :(得分:1)