Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Mmap与大型分配的静态分配_C_Linux_Gcc_Mmap_Static Allocation - Fatal编程技术网

C Mmap与大型分配的静态分配

C Mmap与大型分配的静态分配,c,linux,gcc,mmap,static-allocation,C,Linux,Gcc,Mmap,Static Allocation,我分配了相当大的,大约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) 对于前者,应用程序(忽略启动时间)的运行速度似乎略快 忽略失败的分配,每种方法的优缺点是什么?我会使用

我分配了相当大的,大约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)
对于前者,应用程序(忽略启动时间)的运行速度似乎略快


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

我会使用
mmap
malloc
,因为失败案例更容易处理(并且您至少可以给出一条有意义的错误消息)。使用静态数据时,程序的运行将失败(shell尝试使用它将给出一条不太有用的消息)

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

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

不要期望子系统能够很好地处理这个问题。使计算机无法使用是非常重要的。或者考虑使用.< /P>
除非你能访问一台专门的超级计算机,否则它看起来像是一个设计错误(目前的台式机最多有32GB)。

没有任何理由为此使用
mmap
malloc
很有能力做到这一点,并且通常会在引擎盖下使用
mmap
,但是使用
malloc
可以使代码更简单、更容易理解和更便于携带


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

在如此庞大的数据中,你放了什么?