2010-03-22 38 views
3

我試圖找出boost :: multi_array構造函數或resize方法是否可以拋出bad_alloc異常(或其他異常,指示分配或調整大小失敗)。我無法在任何地方找到這些信息。boost :: multi_array調整大小異常?

澄清(從評論中加入):

這是一個科學算法如果分配失敗,可以回退到更少內存密集型(更慢)的方法。基本上有兩個動態分配的三維陣列,用於保存查詢中所有基因對之間的「距離」(相關性)以及大量數據集中每個數據集的交叉驗證集中的所有基因。根據需要,較慢的方法會重新計算每個距離。這是針對現有Java實現的C++版本,它實現了這兩種方法,並且會回退到內存不足異常。我真的不希望內存不足。

回答

1

1:(回答真正的問題):由於它動態地使用分配內存,是的,它可以拋出std::bad_alloc(我從來沒有見過boost翻譯std::bad_alloc例外;這樣做會很瘋狂)。

第2條:(對您的說明發表評論):您確實需要可用物理內存的信息來優化算法在運行時的性能。然而,你不能依靠std::bad_alloc來確定你有多少內存可用,因爲現代操作系統使用這樣的東西,如過度承諾,這意味着:他們(幾乎)永遠不會返回失敗的分配嘗試,而只是給你一些「內存「,當你真正嘗試訪問它時,它只會失敗。

在Java中,這可能會起作用,因爲VM正在爲您做很多事情:它會嘗試分配一些連續的內存塊,並針對可用的物理內存和可用的物理內存來決定是否可用它應該更強調GC還是隻分配一個更大的垃圾。另外,出於性能原因,您需要考慮到虛擬內存和物理內存是完全不同的概念。

如果需要性能,優化你的算法對於這樣的情況(這很可能是必要的,這取決於你的工作區),您需要檢查您的特定平臺的功能,它可以告訴你如何「真正的世界「看起來像。

+0

看到我上面的評論,該算法,由原始研究人員在Java中實現,支持兩種方法。如果不能分配足夠的內存,則使用較慢的一個。我期待爲C++版本重新創建此行爲,但我通常不希望內存不足。當我們發現我的C++實現在內存方面比舊版Java更有效時,我們已經擺脫了程序使用的另一種算法的這種退步。 – Glen 2010-03-24 11:21:55

0

缺乏明確的異常規範是故意的。請參閱this小節以獲取解釋。此外,請注意,缺少明確的規範意味着函數可能拋出的異常類型沒有限制。所以,至少,ctor和resize函數可以在內存耗盡或者項目對象複製失敗時引發異常。

啓發升壓,你可能有興趣在一些通用的參考是:

+0

我做不認爲OP意味着他正在尋找異常規範... – gimpf 2010-03-22 14:47:49

+0

@gimpf:不,但缺少相同的東西可能會讓他困惑。 – dirkgently 2010-03-22 14:54:07

+0

可能是。我希望澄清。 – gimpf 2010-03-22 15:37:05

0

爲什麼不測試它?很容易通過一個荒謬的高價值來產生異常。

另一方面,如果產生這種異常,你打算做什麼?std::bad_alloc是你通常在微觀層面上無法處理的那種異常...

例如,在網絡服務器上,通常會執行一些清理(對db事務進行回滾?),然後將500錯誤返回給用戶。

但內存耗盡時,有沒有什麼可以安全地完成,因爲你必須謹慎行事,如果你不想再一次擊中了內存牆,你知道是接近:)

+0

這是一種科學算法,如果分配失敗,可以回退到內存較少(較慢)的方法。基本上有兩個動態分配的三維陣列,用於保存查詢中所有基因對之間的「距離」(相關性)以及大量數據集中每個數據集的交叉驗證集中的所有基因。根據需要,較慢的方法會重新計算每個距離。這是針對現有Java實現的C++版本,它實現了這兩種方法,並且會回退到內存不足異常。我真的不希望內存不足 – Glen 2010-03-24 11:17:42