C 一次可以处理多少数据?Linux等现代操作系统的限制是什么?

C 一次可以处理多少数据?Linux等现代操作系统的限制是什么?,c,linux,malloc,C,Linux,Malloc,可以处理多少数据以及如何确定限制?我正在用C编写一个算法,它基本上重复使用数组中存储的一些数据。我的想法是将这些数据保存在动态分配的数组中,但我不确定是否有可能将这些数据保存在malloced中 我使用大小为2046的200个数组来保存每个大小为8字节的复杂数据。我在整个过程中都会用到这些,所以我不希望反复计算 你对这种方法的可行性有什么想法 谢谢 Mir32位操作系统的限制为4Gb,通常有些(在win32上高达一半)是为操作系统保留的-映射图形卡内存的地址空间等 Linux在32位版本上支持6

可以处理多少数据以及如何确定限制?我正在用C编写一个算法,它基本上重复使用数组中存储的一些数据。我的想法是将这些数据保存在动态分配的数组中,但我不确定是否有可能将这些数据保存在malloced中

我使用大小为2046的200个数组来保存每个大小为8字节的复杂数据。我在整个过程中都会用到这些,所以我不希望反复计算

你对这种方法的可行性有什么想法

谢谢
Mir

32位操作系统的限制为4Gb,通常有些(在win32上高达一半)是为操作系统保留的-映射图形卡内存的地址空间等

Linux在32位版本上支持64Gb的地址空间(使用Intel的36位PAE)。
编辑:尽管每个进程仅限于4Gb
分配大量内存的主要问题是,如果需要将其锁定在RAM中,那么显然需要大量RAM。或者,如果您需要所有的内存都是连续的,那么获得4*1Gb的内存块要比没有其他阻碍的单个4Gb内存块容易得多

一种常见的方法是在程序开始时分配您所需的所有内存,这样您就可以确保如果应用程序不可能运行,它将立即失败,而不是在完成90%的工作时。
不要同时运行其他内存密集型应用程序。

您还可以使用一系列标志向内核建议此应用程序应在内存中获得优先级或将内存锁定在ram中-很抱歉,我在linux上使用HPC的时间太长了,我可能已经过时了现代内核。

可以分配多少内存取决于:

  • 您的程序可以直接寻址多少内存
  • 有多少物理内存可用
  • 有多少交换空间可用
在现代的平面内存型32位系统上,您的程序可以寻址4G字节,但有些地址空间(通常为2G字节,有时为1G字节)是为内核保留的。因此,根据经验,假设您有物理内存和交换空间来备份它,您应该能够一次分配近2GB的内存

在运行64位操作系统和64位程序的64位系统上,可寻址内存基本上是无限的


200个2048字节的数组每个只有400k,应该可以放入缓存中(即使是在智能手机上)。

我认为在大多数现代(64位)系统上,如果有那么多内存可用,您可以通过
malloc(size\t)
调用一次分配4GB。每个“复杂数据”条目有多大?如果它们的大小为256字节,则只需分配100MB

256bytes × 200 arrays × 2048 entries = 104857600bytes  
104857600 bytes / 1024 / 1024 = 100MB.

因此,对于4096字节,每个字节仍然只有1600MB或更多≃ 1.6GB所以在今天的大多数系统上都是可行的,我四岁的笔记本电脑有3GB的内存。有时我使用GIMP进行图像处理,它占用了2GB以上的内存。

对于一些
malloc()
的实现,这些区域在真正使用之前实际上没有内存支持,因此理论上可以永远进行下去(当然,在实践中,分配给内核中进程的已分配区域的列表会占用空间,因此您可能会发现您只能调用
malloc()(这就是为什么它会有OOM杀手,因为当时它过于乐观).

页面对齐可以将其膨胀到800kiB到12800kiB之间。OMAP3最多有256k二级缓存。16k数据,16k指令一级缓存。而且OMAP3与智能手机一样快速和庞大。别忘了,库和程序占用了3 GB可用空间中的一大块,在程序开始以下的范围也是如此总是禁止捕捉指针错误。当然,所有这些加起来通常只有几十兆字节(对于控制台应用程序),因此,唯一真正的问题是它会将地址空间分割,从而无法进行大规模连续分配。您错过了虚拟内存分割。如果您需要的块中间有一个共享库,则无法分配单个块:您需要malloc两个块并以某种方式对其进行管理。有时我忘记了我在日常工作中使用的所有新智能手机芯片实际上都还没有上市。PAE允许系统使用高达64GB的物理内存。它不允许进程突破4GB的限制,因为虚拟地址仍然是32位。好的。预分配似乎是个好主意。我将尝试一下。感谢我的数据类型只有8字节长,因此适合p很完美。感谢你是64位的,你绝对永远无法分配4GB的虚拟内存块。+1票支持标题。真的帮了我的忙。