簡體   English   中英

具有很大尺寸的2D矢量

[英]2D vector with very large size

我在c ++中定義了一個2維向量,它的大小太大。 主唱的定義是這樣的:

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

當我運行程序時,出現以下錯誤:

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

在運行程序之前,我在控制台行中接受以下命令,該命令指定堆棧大小將不受限制:

ulimit -s unlimited

但是我又遇到分配錯誤。如何在c ++中定義這么大的向量?

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

這使我們每個字符串12個字節*每行240005個字符串* 3600行,總計9.7 GB,這遠遠超出了32位實現所能處理的范圍。 更糟糕的是,一個實現可能會輕易地將12字節的字符串填充為16字節,從而進一步增加了所需的內存。

如果使用64位實現,則可以尋址更多的內存,但是大小可能會增加一倍,因此僅存儲空字符串數組就需要大約20 GB的內存。 添加一些實際內容,您將需要更多內容(同樣,可以很容易地將字符串填充為更大的字符串)。

所以,是的,有64位實現這大概可以做工作,但它是不切實際的大多數的目的。 您可能希望/需要找到某種方法來減少使用的字符串數。

嘗試預先分配那么多空間,表明您對問題采取了錯誤的方法。 我懷疑double向量中的大多數節點都將為空。 如果是這種情況,那么使用雙映射而不是雙向量會更好:

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

然后,僅創建必須具有的條目,而不是預先分配整個數組。

請注意:即使您未為其分配任何內容,使用'[]'運算符也會自動創建一個節點。 如果您不想創建節點,請使用“ find()”而不是“ []”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM