簡體   English   中英

從許多(大)字典中構建一個(大)稀疏矩陣

[英]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.

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