我目前正在構建一個代碼,它動態地處理使用向量類的大量內存。只有存在足夠的內存時,才能使用向量push_back
該代碼正在構建與push_back
的矢量,其中重要的是要注意向量是2維的,表示數據矩陣。根據情況,這個矩陣可能很小,或者變得特別大。
例如,數據矩陣可以有幾行,每行有1000列,或者它可以獲得1000行,列數相同,充滿雙數據類型。很明顯,這很容易成爲問題,因爲1000x1000x8 = 8 000 000字節,因此表示8 MB內存。但是,如何增加10倍的行數和10倍的行數呢? (這很容易發生在我的代碼中)。
我正在通過將數據矩陣寫入硬盤驅動器來解決這個問題,但是這種方法相當慢,因爲我沒有充分使用內存。
我的問題: 如何建立使用push_back
vector< vector<double> >
代表這個矩陣,但只有在有可分配足夠的內存。
如果內存數量不足,我會繼續將數據導出到一個文件中,釋放分配的內存並啓動循環。我不知道的是如何檢查每個執行的push_back
內存是否可用。
編輯: 我應該注意到,我使用的是運行Ubuntu的64位機器。我不太確定如何以及OS分頁是否正在運行,但是我實際上正在做的是在存在電場和磁場的情況下對粒子進行數值計算。可以有超過1000個時間步進的1億個粒子,這是大量的GB數據。但是,有時候我只運行幾十萬個粒子來進行適合RAM的測試,而不會出現問題,從而加速了計算過程。我正在嘗試創建一些通用的解決方案來檢查是否有足夠的內存用於其他計算,如果沒有,則將它們移動到文件中。這些粒子可以添加到系統中或從中流出,所以基本上我不知道矩陣在任何給定時間有多大。這就是爲什麼我需要「好的就夠了,將這些數據移出這裏,以便我們可以重新開始」方法。
使用自定義分配器,當您達到內存閾值時會失敗? –
try {v.push_back()} catch(std :: bad_alloc&e){free_stuff()} http://stackoverflow.com/questions/7749066/how-to-catch-out-of-memory-exception-in- c –
可能值得注意的是,底層操作系統會根據需要(頁面)將頁面刷新到磁盤,所以值得信任操作系統提供所需的虛擬化,而不是自己處理它。這意味着您的進程可以使用比機器上存在的物理內存更多的內存。 – millinon