2014-04-02 3 views
2

파일은 나에게 400x400x200x1 배열과 모양을 제공합니다. 배열에 의해 전송 된 데이터에 따라 모양이 변경됩니다. 내 임무는 400x400x200x1 배열을 포함하는 데이터에 적용하는 것입니다. 예
:큰 배열을 사용하여 RAM을 대량으로 사용하지 못하는 이유는 무엇입니까?

shape = np.array([20,180,1,1]) 
b= []        
l = np.load("testfile.npy") 
d = (np.reshape(l[:shape[0],:shape[1],:shape[2],:shape[3]],(shape[0],shape[1]))).transpose() 
append(d) 

아이디어는 데이터에 적합한 크기와 새로운 배열을 생성하는 것이다. 나는이 과정을 여러 번 수행해야하지만, 내가 할 때마다, 내 RAM-부하율 증가 :

shape = np.array([20,180,1,1]) 
b= []        
for j in range(9): 
    l = np.load("testfile.npy") 
    d = (np.reshape(l[:shape[0],:shape[1],:shape[2],:shape[3]],(shape[0],shape[1]))).transpose() 
    time.sleep(2) 
    b.append(d) 

load factor

는 appendet 배열이해서인가요 : 이제 문제가 온다 그래서 큰? 내가 추가 해요 출력 배열은 180x20의 크기를 가지고 있지만 RAM로드 인자는 0,12GB 때마다 증가합니다. 거기에 tempfiles없이 배열을 저장하는 더 효율적인 방법은 무엇입니까?

내 영어를 사용해 죄송합니다.

답변

4

예에서 오류는 for 루프의 각 반복마다 파일을 다시로드한다는 것입니다. 시도 :

l = np.load("testfile.npy") 
shape = np.array([20,180,1,1]) 
b = [] 
for j in range(9): 
    d = (np.reshape(l[:shape[0],:shape[1],:shape[2],:shape[3]],(shape[0],shape[1]))).transpose() 
    time.sleep(2) 
    b.append(d) 

해결되면 문제가 해결됩니다.

이제, 그 이유는 무엇인가 : 당신이 암시 적으로 그것을 (d)의 일부에 view을, 파일에서 l을로드하고 b이보기를 추가 각 반복에서. 뷰는 실제로 전체 배열에 대한 참조를 포함합니다. 따라서 매번 배열 전체를로드하고 참조가있는 객체를 저장하므로 가비지 수집기를 사용하지 않도록 설정하여 메모리를 비울 수 있습니다.

언제든지 파일을 다시로드해야 할 경우 다른 해결책은 명시 적으로 복사본을 만들어 전체 배열에 대한 참조를 잃는 것입니다.주장 :

b.append(d.copy()) 

주 1 : 당신의 예에서,에 의해 마지막 줄 교체

주 2 d을 무시할 수있는 뷰의 크기가 l 비교하기 때문에, 사실을, 당신은 항상 복사본을 만들어야합니다 dl에 대한 참조를 유지하는 것이 당신은

d.base.base.base is l # True 

.base가 볼 배열에 대한 참조입니다 할 수 있습니다. 귀하의 경우 깊이가 3 가지가 있습니다 : l[...] 조각, 모양 변경 및 조 변경.

+0

필자의 경우 큰 배열은 함수에서 왔고 데이터가 변경되면 함수를 새 데이터로 다시로드해야합니다. 두 번째 제안은 내 문제를 해결했습니다. 고마워요! – Hubschr

2

대부분의 RAM 사용은 전체 400x400x200x1 어레이를 메모리로 읽음으로써 발생합니다. 메모리 맵에 NumPy와주기 대신 입력 배열하고 그것의 대부분을 판독 방지 할 수 있어야한다 :

이 가능한 원본 배열 모두 reshapetranspose 복귀 뷰 이후
l = np.load("testfile.npy", mmap_mode='r') 

, 또한에 가치가있을 수있다 명시 적으로 결과 복사본을 만듭니다.

d = l[:20, :180, 0, 0].transpose().copy() 

당신이 선택한 특정 인덱스 NumPy와보기를 반환 할 수 있다고 생각하지 않지만, 그것은보기를 반환 않는 경우, 뷰에 전체 원래 배열의 원인이됩니다 : 우리는 또한 색인을 단순화 할 수 있습니다 유지되어야한다. 메모리 맵핑 된 배열의 경우 뷰가 메모리 맵핑 될 것이라고 생각합니다.

+0

큰 배열이 함수에서 반환 될 때 numpy.memmap을 어떻게 사용할 수 있습니까? 예 : 'bigarray = functionthagivesbigarray()'? 감사! – Hubschr

+1

@Hubschr : 당신은 할 수 없습니다. 함수는 일반적으로 메모리 맵 옵션을 제공해야합니다. – user2357112

관련 문제