2013-08-01 92 views
1

由於某種原因,我需要在我的python程序中有一個像10000x20000x4000x10這樣的維度的四維矩陣。正如我已經試圖使用Python中的普通數組來實現它,我發現它是不可能的,因爲我的受限制的可用系統資源。管理這種大數據結構的最佳方式是什麼?是使用數據庫的唯一方法嗎?在python中管理大數據結構

編輯:因爲它取決於我的目標是什麼,所以我將很快描述我在做什麼。我試圖將1維揹包問題擴展到4維。有2個矩陣保留和必須訪問的解決方案。當我嘗試解決這個這2點矩陣路由器的資源分配問題是這樣的:

keep = [[[[0 for x in xrange(CORE.cap + 1)*1000]for x in xrange(RAM.cap + 1)*1000]for x in xrange(NIC.cap + 1)*1000]for x in xrange(len(JOBS) + 1)] 
solution = [[[[0 for x in xrange(CORE.cap + 1)*1000]for x in xrange(RAM.cap + 1)*1000]for x in xrange(NIC.cap + 1)*1000]for x in xrange(len(JOBS) + 1)] 

有很多的這些矩陣0,我要訪問每次矩陣中的每一行。

+0

它是一個稀疏矩陣(即只有一小部分的單元格填充)?如果是這樣,就有希望。否則,它可能太大了。 – ugoren

+0

爲什麼你認爲你需要一個4D陣列?你真的想做什麼?有很多懶惰/窗口的大數據算法。 – doctorlove

+0

我正在將揹包算法從一維擴展到4.這有點複雜,因爲我試圖用這種算法來解決路由器的資源分配問題。對於揹包的動態編程方法,我需要2個矩陣保留和解決方案。儘管這些矩陣中有很多零。如果你希望我可以執行你的源代碼。 –

回答

1

對於一維揹包,您只需要在內存中保留矩陣的最後兩行。其餘部分可以使用運行長度編碼存儲到磁盤,因爲大多數行將包含與上一行相同的值。也許,對於4D揹包,你可以在內存中做類似的事情(比如只保留一架飛機?),並將其餘部分存儲到磁盤中。

或者,您可以對揹包使用分支定界算法,也可以使用近似算法在其中創建較小的項目和揹包。

+0

我認爲這可能是我正在尋找的解決方案。但是我必須檢查這種方法的性能,因爲不斷讀寫文件可能會使算法變得非常慢。我會執行它並讓你知道它是如何發生的。 –

+0

不幸的是,這種方法在第一步中失敗了,因爲我試圖構建初始文件並將它們填充爲0,這需要很長時間,並且每次運行算法時都必須重複。 –

+0

也許你不需要那樣做。你使用DP,所以你可以計算每列的值。每當你到達一個點時,你不再需要更早的值,你只存儲該列。 –