一次可以索引多少数据?现代操作系统如Linux的限制是什么?

时间:2010-10-18 13:53:31

标签: c linux malloc

可以索引多少数据以及如何确定限制?我在C中编写一个算法,它基本上反复使用存储在数组中的一些数据。我的想法是将其保存在动态分配的数组中,但我不确定是否可以将这些数量进行malloced。

我使用200个大小为2046的数组,每个数组大小为8字节。我在整个过程中使用这些,所以我不想一遍又一遍地计算它。

您对此类方法的可行性有何看法?

由于 米尔

4 个答案:

答案 0 :(得分:3)

32位操作系统有4Gb的限制,通常为操作系统保留一些(win32的一半) - 映射graphcis卡存储器的地址空间等。

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

一种常见的方法是在程序开始时分配您需要的所有内存,这样您就可以确定如果应用程序不可能,它将立即失败,而不是在完成90%的工作时。
不要同时运行其他内存密集型应用程序 还有一堆标志可以用来向内核建议这个应用程序应该在内存中获得优先权或者将内存锁定在ram中 - 对不起,因为我在linux上使用HPC而且我可能已经过时了内核。

答案 1 :(得分:3)

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

  • 您的程序可以直接处理多少内存
  • 可用的物理内存量
  • 有多少可用的交换空间

在现代的平面内存模型32位系统上,您的程序可以容纳4千兆字节,但是一些地址空间(通常为2千兆字节,有时是1千兆字节)是为内核保留的。因此,根据经验,您应该能够一次分配几乎两千兆字节,假设您有物理内存和交换空间来备份它。

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

每个2048字节的200个数组只有400k,应该适合缓存(即使在智能手机上)。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

对于malloc()的一些实现,区域实际上并没有被内存支持,直到它们真正被使用,因此理论上你可以永远地继续(尽管在实践中当然是分配给你的进程的已分配区域的列表)内核占用空间,所以你可能会发现你只能调用malloc()几百万次,即使它实际上从未给你任何记忆。它被称为“乐观分配”,是Linux使用的策略(这就是为什么它具有OOM杀手,因为它过于乐观)。