微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多less数据可以一次mableced? Linux等现代操作系统的限制是什么?

可以调整多less数据,以及如何确定限制? 我正在写一个C语言的algorithm,基本上重复利用数组中存储的一些数据。 我的想法是把这个保存在dynamic分配的数组中,但我不确定是否可能有这样的数量malloced。

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

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

谢谢,米尔

Gtkmm程序编译好,但崩溃 – Windows XP的

以编程方式启用/禁用连接

收集Outlook联系人列表

从ShellExecute获取PID

如何在CheckedBoxList控件中的项目上绘制string?

禁用MSI的还原点创build

控制台+ Windows“窗体

如何在DirectX 11桌面应用程序中更改窗口大小

MonoDevelop 2.4.1不能在windows 7上运行,无法加载glibsharpglue-2

我怎样才能轻松获得在C中的正则expression式select?

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

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

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

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

你的程序可以直接处理多少内存

有多少物理内存可用

有多少交换空间可用

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

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

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

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

Linux在32位版本上支持64Gb的地址空间(使用英特尔的36位PAE)。

编辑:虽然每个进程限于4Gb

分配大量内存的主要问题是如果你需要将它锁定在RAM中 – 那么你显然需要大量的RAM。 或者,如果你需要所有这些都是连续的,那么获得4 * 1Gb的内存比单个4Gb块容易得多。

一个常见的方法是在程序开始时分配所有你需要的内存,这样你就可以确定,如果应用程序不可行,它将立即失败,而不是完成90%的工作。

不要同时运行其他内存密集型应用程序。

还有一堆标志可以用来向内核建议这个应用程序应该在内存中获得优先权或者将内存锁定在内存中 – 抱歉,由于我在Linux上使用了HPC,因此我可能已经过时了内核。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐