2014-12-10 1 views
3

센서에서 스트리밍 데이터를위한 응용 프로그램을 작성한 다음 다양한 방식으로 데이터를 처리하고 있습니다. 이러한 처리 구성 요소에는 데이터 시각화, 일부 숫자 크리티컬 (선형 대수) 및 HDF5 형식의 디스크에 데이터 쓰기가 포함됩니다. 원칙적으로 이러한 구성 요소 각각은 자체 모듈이 될 것이며, 모두 동일한 파이썬 프로세스에서 실행되므로 IPC는 문제가되지 않습니다. 이것은 스트리밍 데이터를 효율적으로 저장하는 방법에 대한 질문으로 이어집니다.NumPy ndarray를 사용하여 HDF5 데이터 세트의 메모리를 공유하는 방법

데이터 세트는 매우 커서 (~ 5Gb) 데이터를 액세스해야하는 구성 요소간에 공유하여 메모리의 데이터 사본 수를 최소화하고 싶습니다. 모든 구성 요소가 똑 바르게 사용 된 경우 ndarray s 다음은 간단해야합니다. 프로세스 중 하나에 데이터를 입력 한 다음 다른 사용자에게 ndarray.view()을 사용하여 사본을 제공하십시오.

그러나 디스크에 데이터를 쓰는 구성 요소는 데이터를 HDF5 Dataset에 저장합니다. 이것들은 많은 방법으로 ndarray과 상호 운용 가능하지만, view()을 생성하면 ndarrary과 같이 작동하지 않습니다.

ndarray들과 함께 관찰 :

>>> import h5py 
>>> file = h5py.File('source.h5', 'a') 
>>> source_dset = file.create_dataset('source', (10,), dtype=np.float64) 
>>> view_dset = source_dset.value.view() 
>>> source_dset[0] = 1 
>>> view_dset[0] == 1 
False 
>>> view_dset.base is source_dset.value 
False 

또한 단지 Dataset.value 자체가 아닌 할당 작동하지 않습니다

>>> source = np.zeros((10,)) 
>>> view = source.view() 
>>> source[0] = 1 
>>> view[0] == 1 
True 
>>> view.base is source 
True 

그러나,이 HDF5 Dataset의 작동하지 않습니다 그것의 view. HDF5 Datasetndarray 공유 메모리가 할 수있는 방법이 바로 메모리를 공유 할 수있는 두 ndarray의로, 거기에 :

>>> view_dset = source_dset.value >>> source_dset[0] = 2 >>> view_dset[0] == 2 False >>> view_dset.base is source_dset.value False 

그래서 제 질문은 이것이다?

아마 HDF5가 메모리에 배열을 저장하는 방법에 약간의 미묘함이 있기 때문에 아마 작동하지 않을 것입니다. 그러나 다소 혼란 스럽습니다. 특히 type(source_dset.value) == numpy.ndarray이고 OWNDATA 플래그가 Dataset.value.view() 인 것은 실제로는 False입니다. view이 해석하는 메모리를 누가 소유합니까?

버전 세부 정보 : Python 3, NumPy 버전 1.9.1, h5py 버전 2.3.1, HDF5 버전 1.8.13, Linux.

기타 세부 정보 : HDF5 파일이 청크입니다.

EDIT 하나의 가능한 해결책은 HDF5 Dataset 자체에 다른 구성 요소를 참조 수득처럼

좀더이 놀아 후 보인다. 이것은 어떤 메모리 (적어도 top에 따르지 않음)를 복사하는 것 같지 않으며 소스 Dataset의 변경 사항이보기에 반영됩니다. (한 메모리 절약 밖으로 이동로)

>>> import h5py 
>>> file = h5py.File('source.h5', 'a') 
>>> source = file.create_dataset('source', (10,), dtype=np.float64) 
>>> class Container(): 
    ... def __init__(self, source_dset): 
    ...  self.dset = source_dset 
    ... 
>>> container = Containter(source) 
>>> source[0] = 1 
>>> container.dset[0] == 1 
True 

나는이 솔루션을 합리적으로 행복 해요,하지만 view 방법은 위의 방법으로 문제가 해결되지 않는 이유를 나는 아직도 궁금하다.

+0

데이터 집합 개체를 지나칠 정도로 큰 성능 저하가 발생합니다. – tacaswell

+0

또한 데이터 세트에 액세스하면 모든 데이터 세트를 한 번에 메모리로로드하지 않으므로 최소한의 메모리 비용으로 데이터 세트의 하위 세트 만 가져올 수 있습니다. 또한 데이터가 청크 된 경우 파일에서 인접하지 않을 수도 있습니다 (심지어 압축 될 수도 있음). 임의의 hyberslab 선택 기능은 hdf5의 주요 기능 중 하나이며 h5py의 주요 기능 중 하나입니다. – tacaswell

+0

@tcaswell 데이터가 실제로 청크 및 압축되어 파일에 인접하지 않을 가능성이 높습니다. 그래서 당신이 옳다고 생각합니다. 주어진 덩어리가 메모리에 존재할 수도 있고 존재하지 않을 수도 있기 때문에, ndarray는 데이터를 참조하는 대신 복사해야합니다. 그런데 왜 데이터를 소유하지 않는 것입니까? 또한, 당신이 생각하고있는 성과는 무엇입니까? – bnaecker

답변

0

numpy 배열과 h5py 데이터 집합간에 메모리를 공유 할 수 없다는 것이 바로 그 해답입니다.비슷한 API를 가지고 있지만 (최소한 색인 생성의 경우에는) 호환 가능한 메모리 레이아웃이 없습니다. 실제로, 일종의 캐시를 제외하고는 데이터 세트가 메모리에 있지 않습니다. 파일에 있습니다. 당신이 numpy 배열 source.view()를 사용해야하는 이유


첫째, 표시되지 않습니다. 예, 배열에서 선택하거나 배열 모양을 바꿀 때 numpy은 복사본이 아닌 view을 반환하려고 시도합니다. 그러나 .view의 대부분의 (모든?) 예에는 dtype과 같은 일종의 변형이 관련되어 있습니다. .view() 코드 또는 문서 예제를 가리킬 수 있습니까?

나는 h5py과 관련하여 많은 경험이 없지만, 해당 문서에서는 h5 파일 객체 주위에 얇은 ndarray와 비슷한 래퍼를 제공합니다. DataSetndarray이 아닙니다. 예를 들어 view을 포함하여 ndarray 메서드가 많지 않습니다.

그러나 색인 생성 DataSetndarray을 반환합니다. view_dset[:]. .value도 마찬가지입니다. (IPython에서 view_dset.value??를 통해) 그 문서의 첫 번째 부분 :

Type:   property 
String form:  <property object at 0xb4ee37d4> 
Docstring:  Alias for dataset[()] 
... 

주 당신이 직접 인덱스 source_dset에있는 DataSet에 새 값을 할당 할 때. 배열을 수정하는 경우를 제외하고는 값의 인덱싱이 작동하지 않습니다. 파일 오브젝트는 변경되지 않습니다.

그리고 배열에서 데이터 집합을 만드는 것은 그들에게 연결하지 않는 엄격한 :

x = np.arange(10) 
xdset = file.create_dataset('x', data=x) 
x1 = xdset[:] 

x, xdsetx1 모든 독립적 인 - 하나는 다른 사람을 변경하지 않습니다 변화. 시간에 관해서

이 배열의 sum

timeit np.sum(x) # 11.7 µs 
timeit np.sum(xdset) # 203 µs 
timeit xdset.value # 173 µs 
timeit np.sum(x1) # same as for x 

비교 셋보다 훨씬 빠르다. 추가 시간의 대부분은 데이터 집합에서 배열을 만드는 데 사용됩니다.

+0

동의.'h5py'에 대한 책과 소스는 색인 생성 작업이 파일의 데이터로 새로운'ndarray'를 채 웁니다. 그리고 많은 독자가 있지만 단 하나의 작가이기 때문에 복사를 막기 위해 이것을하고 싶었습니다. 그러나 당신은 요점이 잘 잡혀있어서 NumPy가보기/복사를 처리하는 것이 나을 것입니다. – bnaecker

관련 문제