簡體   English   中英

元素智能訪問非常大的稀疏矩陣的有效結構(Python / Cython)

[英]Efficient structure for element wise access to very large sparse matrix (Python/Cython)

我正在尋找一種有效的數據結構來表示Python / Cython中非常大的整數矩陣,重點關注元素操作。

我目前正在構建一個模型,該模型需要在大型高度稀疏矩陣上進行大量元素操作(在2MMx500k矩陣上讀取/寫入大約500億次)。 以前我在較小的數據上運行實驗,並使用Python與Cython和Numpy數組,並且理想情況下將繼續使用現有基礎結構的某些部分。

到目前為止我已查看/實施了許多選項。 它們可能沒有完全優化,但所有實現都應該足夠好,以便對每種方法的潛力給出切合實際的想法。 我已經通過創建一個2MMx500k矩陣進行測試,添加了25MM元素,然后再次刪除它們。 這反映了我需要的那種操作。

29 minutes: Cython lists to fill scipy.sparse.coo -> sparse.dok 
10 minutes: Cython lists to fill scipy.sparse.coo -> sparse.lil 
 3 minutes: Dict, s.t. A["%d_%d" % (i,j)] contains M[i][j]
 3 minutes: Dict, s.t. A[(i,j)] contains M[i][j]
<1 minute:  Dict, s.t. A[i*N,j] contains M[i][j]
<1 minute:  <std::map> using Cython

到目前為止,黑客攻擊一個詞典表現最好,但仍然相當慢。 這也感覺太糟糕了,所以我假設必須有一個更有效的方法,特別是考慮到dict解決方案並沒有真正使用任何潛在的Cython可以提供。 是否有更多的Cythonic解決方案? 不幸的是,谷歌並沒有太大的幫助(或者我沒有正確的搜索關鍵詞)。

任何有關如何做到這一點的建議將不勝感激!

編輯1

兩個字典解決方案之間的區別在於A [“%d_%d”%(i,j)]變體訪問速度更快,而A [(i,j)]變體的設置速度更快。

                                                  Setup    Execution
Dict, s.t. A["%d_%d" % (i,j)] contains M[i][j]    180s      30s
Dict, s.t. A[(i,j)] contains M[i][j]               66s     104s
Dict, s.t. Dict, s.t. A[i*N,j] contains M[i][j]    40s       8s

雖然A [“%d_%d”%(i,j)]在當前測試中稍微慢一點,但從長遠來看,最好是因為設置成本只會增加10倍,執行成本為我的實際實驗因子10,000x。

編輯2

我可以通過刪除字符串操作來進一步加速字典版本,而是使用大整數表示,通過在第一個上使用適當大的乘數來連接兩個索引以避免沖突。 使用cdef輸入乘法:

cdef unsigned int key(int a, int b): return a * 10000000 + b

通過優化字典或將數據結構移動到C可能仍然可以進一步提高速度,但這應該足夠快以達到我的目的。 不過,任何其他建議仍然非常受歡迎! 如果我找到使用stl映射或類似數據結構的更有效的解決方案,將報告回來。

編輯3

根據同事的建議,我還使用<std::map>通過它的Cython接口實現了系統,將數據存儲在<int,int>映射中。 一旦我們擁有大量數據,實現實際上比dict實現要慢一些,關鍵區別在於訪問速度:

                  Small data (25MM elements)         Large data (250MM elements)
          Time    total    setup    read/write       total    setup    read/write
Dict[int keys]      40s      25s       8s             369s     269s      72s
<std::map>          26s      11s      12s             376s     169s     177s

如果您沒有進行基於行或列的訪問,則可以使用帶有A[(i,j)]等元組鍵的dict。

暫無
暫無

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

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