2

我正在分配一个相当大的,大约 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)

对于前者,应用程序(忽略启动时间)似乎运行得稍微快一些。

忽略失败的分配,每种方法的优缺点是什么?

4

2 回答 2

5

没有任何理由为此使用mmapmalloc非常有能力做到这一点,并且通常会mmap在引擎盖下使用,但是 usingmalloc使您的代码更简单,更易于理解且更便携。

至于静态数组是否更可取,也许。主要缺点是它迫使您拥有一个实际的单例(这很糟糕),而不是拥有一个数据结构的单个实例,即使您不需要它,它也可能存在于多个实例中。根据您的观点,使用可能是赞成或反对的静态数组的另一个方面是,它将失败案例从您必须在运行时处理的事情转移到程序的调用者必须处理的事情(由于失败execve或在控制到达您的流程之前提前终止流程)。

于 2014-01-03T07:34:46.963 回答
4

我会使用mmapor malloc,只是因为故障情况更容易处理(并且您至少可以给出有意义的错误消息)。使用静态数据,您的程序的execve(2)将失败(并且尝试它的 shell 会给出一个不是很有用的消息)。

但是,我也可能会测试(可能通过解析/proc/meminfo)底层系统是否有足够的内存资源。

最后,在不知道为什么需要这么多数据的情况下,它闻起来很糟糕。你确定你不能这样做吗?如果你真的需要 100GB,你只能在非常大(而且成本很高)的机器上运行。

不要指望虚拟内存子系统通过分页很好地处理这个问题。抖动对于使计算机无法使用非常重要。或者考虑使用madvise(2)

除非您可以使用专门的超级计算机,否则它看起来像是一个设计错误(当前的台式机最多有 32GB)。

于 2014-01-03T07:29:15.370 回答