我正在分配一个相当大的,大约100GB的内存块。确切的大小在编译时始终是已知的。
我应该静态分配吗?
static char data[DATA_SIZE];
或者使用mmap?
data = mmap(NULL, DATA_SIZE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE|MAP_LOCKED|MAP_UNINITIALIZED, -1, 0)
对于前者,应用程序(忽略启动时间)似乎运行得更快。
忽略失败的分配,每种方法的优缺点是什么?
答案 0 :(得分:5)
没有理由使用mmap
来做这件事; malloc
能够做到这一点,并且通常会在引擎盖下使用mmap
,但使用malloc
可以使您的代码更简单,更易于理解,更便于移植。
关于静态数组是否更可取。主要的一点是它强迫你有一个实际的单例(这是坏的),而不是拥有一个数据结构的实例,即使你不需要它,也可以存在于多个实例中。根据您的观点,使用静态数组(可能是pro或con)的另一个方面是它将故障情况从您在运行时必须处理的事情移动到程序的调用者必须处理的事情(由于失败execve
或在控制到达您的流程之前提前终止流程。
答案 1 :(得分:4)
我会使用mmap
或malloc
,因为失败案例更容易处理(并且您至少可以提供有意义的错误消息)。对于静态数据,程序的execve(2)将失败(shell尝试它会产生一个不太有用的消息)。
但是,我也可能测试(可能通过解析/proc/meminfo
)底层系统有足够的内存资源。
最后,不知道为什么你需要这么多数据,它闻起来很糟糕。你确定不能这样做吗?如果你真的需要100Gbytes,你只能在非常大(和昂贵)的机器上运行。
不要指望virtual memory子系统能够很好地处理paging。 Thrashing对于使计算机无法使用非常重要。或者考虑使用madvise(2)。
除非您可以访问专用超级计算机,否则它看起来像设计错误(当前桌面最多只有32 GB)。