如何在C语言中分配大量的内存?

如何在C语言中分配大量的内存?,c,memory,memory-management,C,Memory,Memory Management,我试图研究一个d维范围搜索算法的实用性,该算法在渐近情况下被证明是好的,但与之相关的常数很大。这意味着我需要能够改变d维空间中的点的数量,直到一些非常大的值。使用1如果您在32位处理器和/或操作系统上运行,或者正在为32位而不是64位编译,那么您就不能这样做。即使您在64位处理器上运行并为其编译,您也需要大量的物理内存-malloc尝试连续块,因此交换文件对您没有好处。SIZE_MAX将告诉您可以尝试分配的最大数量,但故障取决于物理限制。如果您在32位处理器和/或操作系统上运行,或者编译为32位

我试图研究一个d维范围搜索算法的实用性,该算法在渐近情况下被证明是好的,但与之相关的常数很大。这意味着我需要能够改变d维空间中的点的数量,直到一些非常大的值。使用
1如果您在32位处理器和/或操作系统上运行,或者正在为32位而不是64位编译,那么您就不能这样做。即使您在64位处理器上运行并为其编译,您也需要大量的物理内存-malloc尝试连续块,因此交换文件对您没有好处。SIZE_MAX将告诉您可以尝试分配的最大数量,但故障取决于物理限制。

如果您在32位处理器和/或操作系统上运行,或者编译为32位而不是64位,那么您就不能,即使您在64位处理器上运行并编译,您也需要大量数据物理内存不足-malloc尝试连续块,因此交换文件对您没有好处。SIZE_MAX将告诉您可以尝试分配的最大数量,但失败取决于物理约束。

您说分配如此大的块开始返回空指针。对我来说,这意味着它会工作一段时间,随着时间的推移,你会分配和释放其中的相当一部分,在做了很多次之后,你开始得到空值

如果是这样的话,你会看到一个典型的内存碎片案例。(如果我的假设不正确,请原谅下面的小说。)过去,我通过编写自己的内存管理器来处理这些问题,它允许我重新定位内存中的对象,为分配新块腾出空间。如果您的代码必须能够将指针保存到分配的块中,那么您的内存管理器将必须包含一个指针实现,该实现将使移动透明。如果您依赖第三方软件,这将变得很难实现

您可以考虑预先分配将要使用的每个块大小的池。这确保了您永远不会将内存分割成只有在使用了整个大内存块池的情况下才能使用大内存块的方式,而不是只有在小内存块中才有足够的可用内存。检查名为的方法

我的可重定位内存的实现是这样的:在程序执行的开始,我分配了最大的可用内存块。(mmap是你的朋友。)如果我找不到一个可以满足分配请求的空闲片段,我会找到一个前后都有一块空闲空间的块,并将其移动到前面空闲空间的位置。我会计划这个移动,这样产生的空闲块就足以满足新请求的分配


这不是一个好的通用解决方案。它可能非常慢,我不会在需要实时性能的系统中使用它。(想想如果为了一次分配而必须洗牌几十个块会发生什么情况。最坏的情况是,为了满足一个请求,必须复制每个分配的字节。)它还要求您能够容忍对引用到此内存的每个指针进行洗牌。但是如果绝对必要的话,它确实比slab分配器提供了更有效的内存使用。

您说分配如此大的块开始返回空指针。对我来说,这意味着它会工作一段时间,随着时间的推移,你会分配和释放其中的相当一部分,在做了很多次之后,你开始得到空值

如果是这样的话,你会看到一个典型的内存碎片案例。(如果我的假设不正确,请原谅下面的小说。)过去,我通过编写自己的内存管理器来处理这些问题,它允许我重新定位内存中的对象,为分配新块腾出空间。如果您的代码必须能够将指针保存到分配的块中,那么您的内存管理器将必须包含一个指针实现,该实现将使移动透明。如果您依赖第三方软件,这将变得很难实现

您可以考虑预先分配将要使用的每个块大小的池。这确保了您永远不会将内存分割成只有在使用了整个大内存块池的情况下才能使用大内存块的方式,而不是只有在小内存块中才有足够的可用内存。检查名为的方法

我的可重定位内存的实现是这样的:在程序执行的开始,我分配了最大的可用内存块。(mmap是你的朋友。)如果我找不到一个可以满足分配请求的空闲片段,我会找到一个前后都有一块空闲空间的块,并将其移动到前面空闲空间的位置。我会计划这个移动,这样产生的空闲块就足以满足新请求的分配

这不是一个好的通用解决方案。它可能非常慢,我不会在需要实时性能的系统中使用它。(想想如果为了一次分配而必须洗牌几十个块会发生什么情况。最坏的情况是,为了满足一个请求,必须复制每个分配的字节。)它还要求您能够容忍对引用到此内存的每个指针进行洗牌。但是如果绝对必要的话,它确实比slab分配器提供了更有效的内存使用。

2^28=256MB

如果您有足够的物理内存,在32位或64位系统上应该是可行的。要检查您是否这样做,请获取
cat/proc/meminfo
的输出并查找
MemFree

我推荐的API是<