簡體   English   中英

大型向量的空間有效的C ++向量分配器?

[英]Space efficient C++ vector allocator for large vectors?

我正在使用一些C ++代碼,這些代碼實現了使用大量小內存塊(gSpan的相對對象,但這沒關系)的圖形算法。 該代碼用C ++實現,並使用std :: vectors存儲許多小元素(每個小元素約64個字節)。 但是,我在比原始作者更大的數據集上使用了此方法,並且內存不足。

但是,看來我的內存不足了。 不成? 我懷疑這是因為std :: vector在每次需要更多內存時都試圖增加大小,而vector堅持使用連續內存。 我有8GB的內存和18GB的交換空間,但是當拋出std :: bad_alloc時,我僅使用6.5GB本地用戶和約8GB虛擬用戶。 我已經捕捉到bad_alloc調用並打印出向量大小,這就是我看到的內容:

size: 536870912
capacity: 536870912
maxsize: 1152921504606846975
terminate called after throwing an instance of 'std::bad_alloc'
    what():  std::bad_alloc

因此,很明顯,我們達到了向量的最大大小,並且庫正在嘗試分配更多的向量,但失敗了。

所以我的問題是:

  • 我以為這是問題所在是正確的嗎?
  • 解決方案是什么(除了“購買更多的RAM”)。 我願意用CPU時間來換內存。
  • 我是否應該將整個代碼轉換為使用std :: list(以及以某種方式在代碼使用的地方實現operator []?)..這樣會更有效嗎? 至少它會允許列表元素不連續...對嗎?
  • 有沒有更好的分配器可以用來覆蓋此用例的vector標准?
  • 我還缺少其他什么解決方案?

由於我不知道最終會使用多少內存,因此我知道即使進行更改,仍然可能沒有足夠的內存來進行計算,但是我懷疑我至少可以得到更多的存儲空間現在,這似乎很快就放棄了。

我會嘗試使用std::deque作為vector的直接插入。 由於有可能(由於)通常使用塊的集合,因此擴展deque可能比擴展vector便宜(就所需的額外內存而言)。

暫無
暫無

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

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