gpt4 book ai didi

c++ - 如何在 C++ 中更改 malloc() 分配的最大大小

转载 作者:太空宇宙 更新时间:2023-11-04 14:06:12 25 4
gpt4 key购买 nike

据我所知,调用 malloc() 基本上意味着程序正在向操作系统请求一大块内存。我正在编写一个与相机接口(interface)的程序,我需要在其中分配足够大的内存以一次存储数百张图像(它是一个快速相机)。

当我为大约 1.9 Gb 的图像分配空间时,一切正常。分配计算非常简单:

int   allocateBurst( int numImages ) 
{
int streamSize = ZIMAGESIZE * numImages;
data.images = new unsigned short [streamSize];
return 0;
}

但是一旦超过 2 Gb 限制,我就会收到如下运行时错误:

terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc

似乎 2 Gigs 可能是我一次可以分配的最大大小。我有 32 Gigs 的 ram,并且希望能够在一次分配中分配更大的内存。这可能吗?

我正在运行 Ubuntu 12.10。

最佳答案

可能存在一个潜在的问题,即操作系统无法为您分配大量内存,因为它正在为其他应用程序使用内存。检查您的操作系统以查看限制是什么。

还知道某些操作系统会将内存“分页”到硬盘。当您的程序请求页面外的内存时,操作系统将与硬盘交换页面。知道这一点,我推荐一个经典的技术“双缓冲”或“多缓冲”。

您至少需要两个线程:读取和写入。一个线程负责从相机读取数据并将其放入缓冲区。当它填满一个缓冲区时,它会从另一个缓冲区开始。同时,写入线程从缓冲区开始并将其写入磁盘( block 文件写入)。当写入线程完成缓冲区时,它会在下一个缓冲区开始。缓冲区应按循环顺序重复使用。

神奇之处在于拥有足够的缓冲区,以便读者永远赶不上作者。

由于您使用的是几个小缓冲区,因此您不应从操作系统中收到任何错误。

有一些方法可以对此进行优化,例如从操作系统获取静态缓冲区。

关于c++ - 如何在 C++ 中更改 malloc() 分配的最大大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16778091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com