[英]Building a sparse matrix using a big, dense 2d array in Python, using Scipy
[英]Building a (big) sparse matrix out of many (big) dicts
我有一系列形式的字典:
dict_k:{(i,j):d_ij}
其中 i 和 j 是對應於要構建的稀疏矩陣中的索引的整數,d_ij 是一個浮點數。 字典最多可以包含 O(100 萬) 個值
我有大約 160 個這樣的詞典,每個詞典大約 16 兆字節。 字典可能包含也可能不包含具有重復值的重復鍵,例如,您可以在兩個不同的字典中找到 (0,0):1.25 鍵/值對。
我想構建一個包含這些字典的稀疏矩陣。 矩陣的條目將由所有詞典中的所有 {(i,j):d_ij} 對給出。
我天真的方法是從所有字典中構建一個巨大的字典,如下所示:
bigDict={}
for i in range(160):
with open(dictionnary_path, "rb") as fp:
bigDict.update(pickle.load(fp))
然后檢索列/行索引及其相應的系數,以構建一個 scipy coo 格式的稀疏矩陣,其中包含行 ( coo_matrix((coefficients, (rows, columns)), [shape=(M, N)])
)。
但這會讓我的電腦在構建巨大的 dict 時死機,你有什么更聰明的方法嗎? 我的最終目標是使用這個稀疏矩陣來執行矩陣向量乘法。
一個例子字典:
{(0, 1704510): 0.125,
(0, 1704511): 0.089,
(0, 1704512): 0.044,
(0, 1704513): 0.021,
(0, 1704514): 0.037,
(0, 1704515): 0.032,
(0, 1704516): 0.021,
(0, 1704517): 0.013,
(0, 502593): 0.089,
(0, 502594): 0.125,
(0, 502595): 0.089,
(0, 502596): 0.044,
(0, 502597): 0.032,
(0, 502598): 0.037,
(0, 502599): 0.032,
(0, 502600): 0.021,
(0, 129844): 0.044,
(0, 129845): 0.089,
(0, 129846): 0.125,
(0, 129847): 0.089,
(0, 129848): 0.021,
(0, 129849): 0.032,
(0, 129850): 0.037,
(0, 129851): 0.032,
(0, 28314): 0.021,
(0, 28315): 0.044,
(0, 28316): 0.089,
(0, 28317): 0.125,
(0, 28318): 0.013,
(0, 28319): 0.021,
(0, 28320): 0.032,
(0, 28321): 0.037,
(0, 4917): 1.0,
(0, 4918): 0.354,
(0, 4919): 0.089,
(0, 4920): 0.032,
(0, 4921): 0.125,
(0, 4922): 0.089,
(0, 4923): 0.044,
(0, 4924): 0.021,
(0, 615): 0.354,
(0, 616): 1.0,
(0, 617): 0.354,
(0, 618): 0.089,
(0, 619): 0.089,
(0, 620): 0.125,
(0, 621): 0.089,
(0, 622): 0.044,
(0, 45): 0.089,
(0, 46): 0.354,
(0, 47): 1.0,
(0, 48): 0.354,
(0, 49): 0.044,
(0, 50): 0.089,
(0, 51): 0.125,
...
(13, 675): 0.354,
(13, 680): 0.089,
(13, 684): 0.089,
(13, 685): 0.125,
...}
矩陣的大小約為 500 萬 x 500 萬
pickle
似乎為相等的整數/浮點數創建了不同的對象,因此您的大部分 memory 用法可能來自鍵和值,而不是來自字典本身。 您可以嘗試對它們進行重復數據刪除,例如:
dedup = {}.setdefault
def d(x):
return dedup(x, x)
bigDict={}
for i in range(160):
with open(dictionnary_path, "rb") as fp:
for (x, y), z in pickle.load(fp).items():
bigDict[d(x), d(y)] = d(z)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.