2011-09-30 2 views
14

클러스터에서 읽으려고하는 PyTables에서 생성 된 다소 큰 HDF5 파일이 있습니다. 개별 덩어리로 읽는 동안 NumPy에 문제가 있습니다. 이제 예제와 함께 가자 :Numpy 및 PyTables가있는 부동 소수점 예외

HDF5 파일이에 내 배열의 전체 모양,

In [13]: data.shape 
Out[13]: (21933063, 800, 3) 

이 배열의 각 항목은 np.float64이다.

크기가 각각 (21933063,10,3) 인 각 노드 읽기 슬라이스가 있습니다. 불행히도 NumPy는 2100 만 개의 모든 서브 프레임을 한 번에 읽을 수없는 것 같습니다. 나는 크기 (2193306,10,3) 10 개 조각으로 이러한 조각을 분할 한 다음 작업 일을 얻을 수 감소 다음 사용하여이 순차적으로 수행하는 것을 시도했다 :

In [8]: a = reduce(lambda x,y : np.append(x,y,axis=0), [np.array(data[i*  \ 
     chunksize: (i+1)*chunksize,:10],dtype=np.float64) for i in xrange(k)]) 
In [9]: 

1 <= k <= 10chunksize = 2193306을. 이 코드는 k <= 9에서 작동합니다. 그렇지 않으면 나는 다음과 같은 얻을 :

In [8]: a = reduce(lambda x,y : np.append(x,y,axis=0), [np.array(data[i*  \ 
     chunksize: (i+1)*chunksize,:10],dtype=np.float64) for i in xrange(k)]) 
Floating point exception 
[email protected] 00:00:00 ~ 
$ 

내가 진행하고 PyTables가 범인 인 것처럼 보인다되고 있는지 파악하는 Valgrind의의 memcheck 도구를 사용하여 시도했다. 추적에 나타나는 두 개의 주 파일은 libhdf5.so.6이고 blosc과 관련된 파일입니다. 또한

, 나는 k=8이있는 경우, 내가 얻을 수 있습니다 :

In [12]: a.shape 
Out[12]: (17546448, 10, 3) 

하지만 마지막 subslice를 추가하는 경우, 내가 얻을 :

In [14]: a = np.append(a,np.array(data[8*chunksize:9*chunksize,:10], \ 
     dtype=np.float64)) 
In [15]: a.shape 
Out[15]: (592192620,) 

사람이 무엇을해야하는지의 어떤 아이디어가 있습니까 ? 감사!

+0

무엇 직접 NumPy와 배열에 데이터를 읽을 때 당신이 얻을 오류? 여러 배열을 추가하여 배열을 작성하는 대신 대상 배열을 미리 할당하는 것이 좋습니다. – DaveP

답변

1

DaveP에서 제안한 것과 같이 큰 배열을 할당하려고 시도 했습니까?

In [16]: N.empty((21000000,800,3)) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
... 
ValueError: array is too big. 

이것은 32 비트 Python에 있습니다. 실제로 20e6 * 800 * 3 * 8/1e9 = 384GB의 메모리가 필요합니다! 하나의 Float64에는 8 바이트가 필요합니다. 한 번에 전체 배열이 정말로 필요합니까?

죄송합니다. 게시물을 제대로 읽지 않았습니다.

k = 8 서브 라이브러리가있는 어레이는 이미 약 4.1GB 크기입니다. 어쩌면 그것이 문제일까요? 마지막 차원 만 대신 으로 사용하는 경우

그것은 작동합니까?

또 다른 제안, 내가 배열의 크기를 조정하는 첫번째 시도 할 것이다, 다음을 채우기 :

a = zeros((4,8,3)) 
a = resize(a, (8,8,3)) 
a[4:] = ones((4,8,3))