2014-10-07 5 views
2

numpy/scipy에서 반복적으로 거대한 희소 행렬을 생성해야합니다. intitialization는 루프 내에서 수행된다이 잘 작동했다 시작되는 시점에파이썬에서 거대한 희소 행렬

matrix = foo(...) 
result = matrix.T.dot(x) 

:

from scipy.sparse import dok_matrix, csr_matrix 

def foo(*args): 
    dim_x = 256*256*1024 
    dim_y = 128*128*512 
    matrix = dok_matrix((dim_x, dim_y))  

    for i in range(dim_x): 
     # compute stuff in order to get j 
     matrix[i, j] = 1. 
    return matrix.tocsr() 

그럼 난 때문에 같은 추가의 계산하는 csr_matrix로 변환해야합니다. 하지만 내 행렬이 점점 더 커지고 내 컴퓨터가 충돌하기 시작합니다. 매트릭스를 저장하는 더 좋은 방법이 있습니까? 기본적

난 다음 요구 사항을 가지고

I는 행렬의 전치 행렬을 계산해야 0
  • 1 행의 매트릭스 형태 플로트 값을 저장해야
    • 내가 계산해야 x_dimensional 벡터 내적
    • 행렬의 크기는 약 1 × 10^9 * 1 × 10^8

    내 ram- 될 수 저장 용량이 초과되었습니다. 스택 오버플로와 인터넷의 나머지 부분에 대한 여러 게시물을 읽었습니다.) PyTables는 매트릭스 계산을 위해 실제로 만들어지지 않았습니다 ... 더 좋은 방법이 있습니까?

  • +0

    나는 이것이 수학/수치 분석 질문의 더 많은 것 같아요 :) 내 Num.Anal. 물론, 그 크기의 행렬을 수행하는 유일한 방법은 그것을 삼각형으로 만드는 것입니다. –

    +0

    또한, 당신이 numpy를 요구하는 것을 알고 있지만 파이썬을위한 다소 완성 된 라이브러리가 있습니다. [그것은 github에있다] (https : // github.com/Twoody/Lin_Alg_py) –

    +0

    이 질문을했을 때, 당신은 수레를 저장하고 싶었지만 int를 제안한 대답을 받아 들였습니다. 나는 단지 흥미 롭다 - 나는 무엇을 여기에서 놓쳤 느냐? 감사! –

    답변

    2

    파이썬이 당신을 위해 할 수있는 한계에 부딪혔을 수도 있고, 조금 더 할 수도 있습니다. np.float32의 데이터 유형을 설정해보십시오. 64 비트 시스템을 사용하는 경우 정밀도가 떨어지면 메모리 소비가 줄어들 수 있습니다.

    matrix = dok_matrix((dim_x, dim_y), dtype=np.float32)  
    

    또는 아마도 훨씬 느린, 그러나 더 적은 메모리 소비 : (처리 시간의 양을 10 배 걸릴 수 있습니다 어디 예를 본 적이) np.float16은 더욱 메모리에 당신을 도울 수 있지만, 당신의 계산 속도가 느려질 수 있습니다 :

    matrix = dok_matrix((dim_x, dim_y), dtype=np.float16)  
    

    또 다른 옵션 : 더 많은 시스템 메모리를 구입할 수 있습니다. 당신이 dok_matrix와 매트릭스를 만드는 피할 수, (이 귀하의 계산 가능한 경우 나도 몰라) csr_matrix와 대신을 만들 수 있다면


    마지막으로, DICT에 약간의 오버 헤드를 저장할 수 dok_matrix를 사용합니다.

    2

    이 사건을 위해 나는 요소마다 하나의 바이트를 필요로하는 데이터 유형 np.int8 (또는 np.uint8)를 사용하는 것이 좋습니다 :

    직접 csr_matrix는 당신이 최대 행렬 크기가 더 갈 수 있도록 구성
    matrix = dok_matrix((dim_x, dim_y), dtype=np.int8) 
    

    :

    from scipy.sparse import csr_matrix 
    
    def foo(*args): 
        dim_x = 256*256*1024 
        dim_y = 128*128*512 
        row = [] 
        col = [] 
    
        for i in range(dim_x): 
         # compute stuff in order to get j 
         row.append(i) 
         col.append(j) 
        data = np.ones_like(row, dtype=np.int8) 
    
        return csr_matrix((data, (row, col)), shape=(dim_x, dim_y), dtype=np.int8)