2011-09-07 2 views
2

기존 pytables 테이블에 큰 데이터 세트 (> 30Gb)를 추가하려고합니다. 테이블은 N 개의 열이고 데이터 세트는 N-1 개의 열입니다. 하나의 열은 다른 N-1 열을 알고 난 후에 계산됩니다.대용량의 데이터를 테이블 (HDF5) 데이터베이스에 추가하는 경우 database.numcols! = newdata.numcols?

데이터베이스에 추가하기 전에 데이터 세트의 청크를 메모리에 읽기 위해 numpy.fromfile()을 사용하고 있습니다. 이상적으로는 데이터베이스에 데이터를 저장 한 다음 마지막 열을 계산하고 Table.modifyColumn()을 사용하여 작업을 완료하는 것이 좋습니다.

테이블에 numpy.zeros((len(new_data), N))을 추가 한 다음, Table.modifyColumns()을 사용하여 새 데이터를 채우는 것으로 생각했지만 누군가가 필요한 각 청크에 대해 거대한 빈 데이터 배열을 생성하지 않는 좋은 방법을 알고 있습니다. 추가.

+0

혼란스러워. 왜 제로 열을 추가하지 않는 것이 좋을까요? np.zeros (len (new_data, 1)) –

+0

나는 혼란 스럽다. 너에게 0의 열을 덧붙이라고 제안하는거야? – Phil

+0

코드 샘플을 제공해 주시겠습니까? 나는 이제 당신이 hdf5 파일과 PyTables에서 데이터를 읽기 위해 numpy를 사용하여 (다른?) hdf5 파일을 조작한다는 것을 이해한다고 생각하십니까? 왜 테이블에 삽입하기 전에 numpy .concatenate 배열을 확장하지 않을까요? 나는 네 목표가 무엇인지 모르겠다. –

답변

1

열이 모두 같은 유형의 경우, 당신은 당신이 형태의 파일에서 읽은 배열을 만들기 위해 numpy.lib.stride_tricks.as_strided을 사용할 수 있습니다 (L, N-1) 모양 (L, N) 모양. 예 :

In [5]: a = numpy.arange(12).reshape(4,3) 

In [6]: a 
Out[6]: 
array([[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11]]) 

In [7]: a.strides 
Out[7]: (24, 8) 

In [8]: b = numpy.lib.stride_tricks.as_strided(a, shape=(4, 4), strides=(24, 8)) 

In [9]: b 
Out[9]: 
array([[ 0, 1, 2, 3], 
     [ 3, 4, 5, 6], 
     [ 6, 7, 8, 9], 
     [ 9, 10, 11, 112]]) 

이제이 배열 b을 사용하여 표를 채울 수 있습니다. 각 행의 마지막 열은 다음 행의 첫 번째 열과 같지만 값을 계산할 수있을 때이를 덮어 씁니다.

a이 레코드 배열 (즉, 복잡한 dtype을 가짐) 인 경우 작동하지 않습니다. 이를 위해서는 numpy.lib.recfunctions.append_fields을 시도해보십시오. 데이터를 새로운 배열로 복사하기 때문에 상당한 메모리를 절약 할 수는 없지만 모든 쓰기를 한 번에 할 수 있습니다.

+0

b는 같은 메모리를 사용하고 있는가? 그렇다면 나는 사업에 종사하고있다! 감사. – Phil

+0

예,'b'는'a'와 같은 메모리를 사용합니다. – AFoglia

1

다른 테이블에 결과를 추가 할 수 있습니다. 계산 된 열이 다른 열에 인접해야하는 몇 가지 이유가있는 경우가 아니면 가장 쉬운 방법입니다. 어쨌든 계산에서 원시 데이터를 분리하는 데있어 무언가가 있습니다.

테이블의 크기를 늘려야하는 경우 h5py을 사용하십시오. h5 파일에 대한보다 직접적인 인터페이스를 제공합니다. 데이터 세트가 h5 파일에서 작성된 방법에 따라 단순히 데이터에 열을 추가하는 것이 불가능할 수도 있습니다. 일반 데이터 형식에 대한 설명은 1.238, "데이터 공간", http://www.hdfgroup.org/HDF5/doc/UG/03_DataModel.html을 참조하십시오. h5py는 기본 데이터 집합이 지원하는 경우 resize을 지원합니다.

또한과 같이 입력 데이터를 저장하는 하나의 버퍼를 사용할 수 있습니다

z = zeros((nrows, N)) 
while more_data_in_file: 
    # Read a data block 
    z[:,:N-1] = fromfile('your_params') 
    # Set the final column 
    z[:,N-1:N] = f(z[:,:N-1]) 
    # Append the data 
    tables_handle.append(z) 
+0

모든 것을 함께 보관해야하는 이유가 있습니다. 데이터는 "시간"과 "샘플"과 유사합니다. 여기서 "시간"은 계산 된 값입니다. 나는 h5py를 살펴볼 것이다. – Phil

+0

업데이트 된 응답을 보내 주셔서 감사합니다. 나는 왜 내가 각 패스에서 더미 데이터를 생성해야한다고 생각하는지 모르겠다. – Phil

관련 문제