센서에서 스트리밍 데이터를위한 응용 프로그램을 작성한 다음 다양한 방식으로 데이터를 처리하고 있습니다. 이러한 처리 구성 요소에는 데이터 시각화, 일부 숫자 크리티컬 (선형 대수) 및 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 Dataset
과 ndarray
공유 메모리가 할 수있는 방법이 바로 메모리를 공유 할 수있는 두 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
방법은 위의 방법으로 문제가 해결되지 않는 이유를 나는 아직도 궁금하다.
데이터 집합 개체를 지나칠 정도로 큰 성능 저하가 발생합니다. – tacaswell
또한 데이터 세트에 액세스하면 모든 데이터 세트를 한 번에 메모리로로드하지 않으므로 최소한의 메모리 비용으로 데이터 세트의 하위 세트 만 가져올 수 있습니다. 또한 데이터가 청크 된 경우 파일에서 인접하지 않을 수도 있습니다 (심지어 압축 될 수도 있음). 임의의 hyberslab 선택 기능은 hdf5의 주요 기능 중 하나이며 h5py의 주요 기능 중 하나입니다. – tacaswell
@tcaswell 데이터가 실제로 청크 및 압축되어 파일에 인접하지 않을 가능성이 높습니다. 그래서 당신이 옳다고 생각합니다. 주어진 덩어리가 메모리에 존재할 수도 있고 존재하지 않을 수도 있기 때문에, ndarray는 데이터를 참조하는 대신 복사해야합니다. 그런데 왜 데이터를 소유하지 않는 것입니까? 또한, 당신이 생각하고있는 성과는 무엇입니까? – bnaecker