2013-05-27 59 views
1

据我所知,调用malloc()基本上意味着程序正在向操作系统请求大量内存。我正在编写一个程序来与相机连接,在这个程序中,我需要分配足够大的存储空间来存储数百张图像(它是一个快速相机)。如何更改C++中的malloc()分配的最大大小

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

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个演出可能是最大尺寸我可以一次分配。我有32 Gig的内存,并希望能够在一次分配中分配更大的内存。这可能吗?

我正在运行Ubuntu 12.10。

+0

可能重复的[I想要一个任意大的缓冲区在Linux/C/C + +](http://stackoverflow.com/questions/8317011/i-want-an-arbitrarily-large-buffer-in-linux-cc) –

+0

是二进制编译为64-位? –

+1

是的,它编译为64位 –

回答

-2
int allocateBurst(int numImages) 
{ 
    // change that from int to long 
    long streamSize = ZIMAGESIZE * numImages; 
    data.images = new unsigned short [streamSize]; 
    return 0; 
} 

尝试使用

long 

OR

铸allocateBurst函数的结果为 “uint_64” 和函数的返回类型uint_64

因为INT你分配32当long或uint_64分配64位分配时,可能会为你分配更多的内存空间。

希望帮助

+0

操作系统不关心你打算使用你分配的内存。 – Cubic

+0

我不同意你的看法,因为某些应用程序需要大量内存,可能会占用较长时间的空间,并使其他进程等待永久挂起或阻塞的CPU ......然后在这种情况下,OS内存管理系统必须关心内存分配的内容 –

1

有可能是一个潜在的问题,因为它使用的内存为其他应用程序的操作系统不能同意你的大内存分配。检查你的操作系统,看看有什么限制。

也知道一些操作系统的将页面内存“分页”到硬盘上。当您的程序要求在页面外部存储时,操作系统会将页面与硬盘交换。了解了这一点,我推荐了“双缓冲”或“多缓冲”的经典技术。

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

神奇的是有足够的缓冲区,以便读者永远赶不上作家。

由于您正在使用一对小缓冲区,因此您不应该从操作系统得到任何错误。

这些是优化此方法的方法,例如从操作系统获取静态缓冲区。

1

问题是你使用一个有符号的32位变量来描述一个无符号的64位数字。

使用“size_t”而不是“int”来保存存储计数。这与您打算存储的内容无关,只需要计算它们的数量。

#include <iostream> 

int main(int /*argc*/, const char** /*argv*/) 
{ 
    int units = 2; 

    // 32-bit signed, i.e. 31-bit numbers. 
    int intSize = units * 1024 * 1024 * 1024; 

    // 64-bit values (ULL suffix) 
    size_t sizetSize = units * 1024ULL * 1024ULL * 1024ULL; 

    std::cout << "intSize = " << intSize << ", sizetSize = " << sizetSize << std::endl; 

    try { 
    unsigned short* intAlloc = new unsigned short[intSize]; 
    std::cout << "intAlloc = " << intAlloc << std::endl; 
    delete [] intAlloc; 
    } catch (std::bad_alloc) { 
    std::cout << "intAlloc failed (std::bad_alloc)" << std::endl; 
    } 

    try { 
    unsigned short* sizetAlloc = new unsigned short[sizetSize]; 
    std::cout << "sizetAlloc = " << sizetAlloc << std::endl; 
    delete [] sizetAlloc; 
    } catch (std::bad_alloc) { 
    std::cout << "sizetAlloc failed (std::bad_alloc)" << std::endl; 
    } 

    return 0; 
} 

输出(克++ -m64 -o测试TEST.CPP下薄荷15的64位与G ++ 4.7.3在虚拟机上的内存4GB)的

 
intSize = -2147483648, sizetSize = 2147483648 
intAlloc failed 
sizetAlloc = 0x7f55affff010