2014-01-18 118 views
0

我在C++中定義了一個尺寸太大的2維矢量。該voctor定義是這樣的:尺寸非常大的2D矢量

vector<vector<string> > CommunityNodes(3600, vector<string>(240005)); 

當我運行該程序,我有以下錯誤:

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

我運行程序之前,我走在console線以下命令來指定堆棧的大小將是無限的:

ulimit -s unlimited 

但我又有分配error.how我可以在C++中定義這樣的大矢量?

+1

縮小尺寸。 – johnchen902

+0

你試圖分配一個大小爲823.992 MB的字符串數組,究竟是什麼原因? – Brandon

回答

3

我們假設std::string的實現包含一個32位指針指向其內容,一個32位int表示當前字符串長度,一個32位int表示當前分配大小。

這給了我們每個字符串12個字節*每行240005個字符串* 3600行,這可以達到9.7千兆字節 - 遠遠超過您在32位實現中可以處理的數量。更糟糕的是,一個實現可能很容易將這個12字節的字符串填充到16個字節,從而增加了所需的內存。

如果您使用64位實現,則可以訪問更多內存,但大小可能會翻倍,因此您需要大約20 GB的內存來存儲空字符串數組。添加一些實際的內容,你甚至需要更多的東西(而且,再次,字符串可以很容易地被填充到更大)。

所以,是的,對於64位的實現,這個可能會使工作,但對於大多數目的來說這是不切實際的。您可能需要/需要找到一些方法來減少您使用的字符串數量。

+0

我正在一個虛擬機中運行我的peogram,其中32個gig accecible.os的操作系統是Ubuntu 10.04 64位。但我仍然有問題。沒有任何其他解決方案? – user3080720

+0

+1爲答案;如果你不需要所有的字符串,你可以嘗試std :: map >或類似的東西。如果你需要數據的數據,你可能想要使用數據庫? – user1781290

0

試圖預先分配這麼多空間表明您對問題採取了錯誤的方法。我懷疑雙向量中節點的大部分都是空的。如果是這樣的話,你會的東西好得多類似雙地圖,而不是一個雙矢量:

std::map< int, std::map< int, std::string > > CommunityNodes(); 

那麼你就只能創建,而不是預先分配整個數組,你必須有條目。

請注意:使用'[]'操作符將自動創建一個節點,即使您不指定任何內容。如果您不想創建節點,則使用'find()'而不是'[]'。