2013-05-27 54 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