2017-09-04 2 views
1

나는 스파 스 매트릭스 csr 있습니다스파 스 매트릭스 슬라이스 메모리 오류

<681881x58216 sparse matrix of type '<class 'numpy.int64'>' 
    with 2867209 stored elements in Compressed Sparse Row format> 

을 그리고 난 csr의 조각 같은 새로운으로 sparce 행렬을 만들려면 : csr_2 = csr[1::2,:]합니다.

문제 :csr 행렬 만있는 경우 서버의 RAM이 40GB로 사용 중입니다. csr_2 = csr[1::2,:]을 실행할 때 내 서버의 RAM이 128GB로 완전히 덤프되고 "메모리 오류"와 함께 떨어집니다.

+0

귀하의 매트릭스를 그냥 22메가바이트 (값) + 일부 보조-물건, 메모리 아마도 <80메가바이트입니다. 그럼, 그게 당신의 문제의 근원 (귀하의 서버에 뭔가가 아마 39 기가 바이트의 메모리를 사용하고 있는지), 확실합니까? – sascha

+0

(1)이 슬라이스는 두 번째 요소 (홀수 요소)에서 시작하여 다른 요소를 취합니다. (2) 서버에는 도커 컨테이너가 많이 있고 기타 유지 관리 프로세스가 모두 40GB를 사용하여 실행 중입니다. –

답변

0

sparse은 이와 같은 행을 선택하기 위해 행렬 곱셈을 사용합니다. 나는 extractor 행렬의 세부 사항을 다른 SO 질문에서 계산했으나 대략 (m, n) 행렬로부터 (p, n) 행렬을 얻으려면 (p, m) 행렬을 사용해야한다. (0 이외의 값으로 p)).

매트릭스 곱셈 자체는 2 패스 프로세스입니다. 첫 번째 패스는 결과 행렬의 크기를 결정합니다.

밀도가 높은 numpy 어레이와 달리 스파 스 매트릭스 슬라이스는보기를 반환하지 않습니다.

Sparse matrix slicing using list of int

는 추출기 매트릭스에 대한 자세한 내용이 있습니다. 나는 또한 csr.sum(axis=1)을 테스트 할 것을 제안한다. 왜냐하면 그것도 행렬 곱셈을 사용하기 때문이다.


def extractor(indices, N): 
    indptr=np.arange(len(indices)+1) 
    data=np.ones(len(indices)) 
    shape=(len(indices),N) 
    return sparse.csr_matrix((data,indices,indptr), shape=shape) 

그래서 다른 모든 행을 인덱싱하는 것은 필요합니다 귀하의 예제에서

In [99]: M = sparse.random(100,80,.1, 'csr') 
In [100]: M 
Out[100]: 
<100x80 sparse matrix of type '<class 'numpy.float64'>' 
    with 800 stored elements in Compressed Sparse Row format> 
In [101]: E = extractor(np.r_[1:100:2],100) 
In [102]: E 
Out[102]: 
<50x100 sparse matrix of type '<class 'numpy.float64'>' 
    with 50 stored elements in Compressed Sparse Row format> 
In [103]: M1 = E*M 
In [104]: M1 
Out[104]: 
<50x80 sparse matrix of type '<class 'numpy.float64'>' 
    with 407 stored elements in Compressed Sparse Row format> 
+0

감사합니다. 나중에 답변을 드리겠습니다. –

+0

그럼, 당신이 제안하는 해결책은 추출 기능을 사용하는 것입니까? –

+0

아니요, 메모리 오류가 발생하는 이유를 제안하고 있습니다. 그러나 당신의 데이터, 숫양 등이 없으면 나는 그것을 증명할 수 없다. – hpaulj

관련 문제