2015-01-28 3 views
0

두 개의 큰 스파 스 매트릭스에 대해 엘리먼트 단위의 곱셈을 수행하려고합니다. 둘 다 약 100M 요소가있는 크기 (400K X 500K)입니다.Scipy 스파 스 매트릭스 행렬 곱셈

그러나 동일한 위치에 0이 아닌 요소가 없으며 0이 아닌 요소의 수가 같지 않을 수 있습니다. 두 경우 모두, 한 행렬의 0이 아닌 값과 다른 행렬의 0 값을 0으로 곱하면됩니다.

모든 접근 방식에서 메모리가 부족합니다 (8GB). 나는있을 수 없다. 이것들은 내가 시도한 것이다.

A와 B는 희소 행렬입니다 (Ive는 COO 및 CSC 형식으로 시도했습니다).

# I have loaded sparse matrices A and B, and have a file opened in write mode 
row,col = A.nonzero() 
index = zip(row,col) 
del row,col 
for i,j in index : 
    # Approach 1 
    A[i,j] *= B[i,j] 

    # Approach 2 
    someopenfile.write(' '.join([str(i),str(j),str(A[j,j]*B[i,j]),'\n'])) 

    # Approach 3 
    if B[i,j] != 0 : 
     A[i,j] = A[i,j]*B[i,j] # or, I wrote it to a file instead 
           # like in approach 2 

for 루프를 주석 처리하면 거의 3.5GB의 메모리가 사용됩니다. 그러나 제품을 파일에 쓰거나 행렬에 다시 쓰는 순간 루프를 사용하는 순간 메모리 사용량이 전체 메모리를 차지하여 실행을 멈추게하거나 시스템이 멈 춥니 다. 어떻게하면 메모리를 많이 소비하지 않고도이 작업을 수행 할 수 있습니까?

답변

1

방금 ​​노력이 작업을 수행 할 때 나는 당신의 희소 행렬이 아닌 스파 스되고있다 의심 : 나는 그것이 더 쉽게 할 수있는 일보다 최적화 될 것으로 생각으로

A.multiply(B) 

합니다.

A = A.tocsr() 
# May also need 
# B = B.tocsr() 
A = A.multiply(B) 
+0

오 .. 그건 그냥, 일 :

경우 당신이 필요한 희소 행렬의 올바른 형식이 아닙니다. 감사! 더블 엑스 – Avisek