[PYTHON] hdf5 파일 결합
PYTHONhdf5 파일 결합
각 hdf5 파일에는 단일 데이터 세트가 있습니다. 데이터 세트가 너무 커서 RAM에 보관할 수 없습니다. 이 파일들을 하나의 파일에 결합하여 모든 데이터 세트를 별도로 포함하고 싶습니다. 즉, 데이터 세트를 단일 데이터 세트로 연결하지 마십시오.
한 가지 방법은 hdf5 파일을 만든 다음 데이터 세트를 하나씩 복사하는 것입니다. 이것은 버퍼링 된 사본이 필요하기 때문에 느리고 복잡 할 것입니다.
이 작업을 수행하는보다 간단한 방법이 있습니까? 본질적으로 컨테이너 파일을 생성하기 때문에 존재해야하는 것처럼 보입니다.
나는 python / h5py를 사용하고있다.
해결법
-
==============================
1.한 가지 해결책은 h5py 인터페이스를 HDF5 API의 하위 레벨 H5Ocopy 기능, 특히 h5py.h5o.copy 기능에 사용하는 것입니다.
한 가지 해결책은 h5py 인터페이스를 HDF5 API의 하위 레벨 H5Ocopy 기능, 특히 h5py.h5o.copy 기능에 사용하는 것입니다.
In [1]: import h5py as h5 In [2]: hf1 = h5.File("f1.h5") In [3]: hf2 = h5.File("f2.h5") In [4]: hf1.create_dataset("val", data=35) Out[4]: <HDF5 dataset "val": shape (), type "<i8"> In [5]: hf1.create_group("g1") Out[5]: <HDF5 group "/g1" (0 members)> In [6]: hf1.get("g1").create_dataset("val2", data="Thing") Out[6]: <HDF5 dataset "val2": shape (), type "|O8"> In [7]: hf1.flush() In [8]: h5.h5o.copy(hf1.id, "g1", hf2.id, "newg1") In [9]: h5.h5o.copy(hf1.id, "val", hf2.id, "newval") In [10]: hf2.values() Out[10]: [<HDF5 group "/newg1" (1 members)>, <HDF5 dataset "newval": shape (), type "<i8">] In [11]: hf2.get("newval").value Out[11]: 35 In [12]: hf2.get("newg1").values() Out[12]: [<HDF5 dataset "val2": shape (), type "|O8">] In [13]: hf2.get("newg1").get("val2").value Out[13]: 'Thing'
위의 내용은 Debian Wheezy의 바닐라 설치에서 Python 버전 2.7.3-4 + deb7u1 위에 h5py 버전 2.0.1-2 + b1과 iPython 버전 0.13.1-2 + deb7u1을 사용하여 생성되었습니다. 위의 파일을 실행하기 전에 f1.h5와 f2.h5 파일이 존재하지 않습니다. salotz 당 Python 3의 경우 데이터 세트 / 그룹 이름은 str이 아닌 바이트 (예 : b "val") 여야합니다.
하위 레벨 인터페이스는 메모리에 캐시 된 것이 아니라 디스크에 저장된 .h5 파일 버전에서 항상 그려지기 때문에 명령 [7]의 hf1.flush ()가 중요합니다. 파일의 루트가 아닌 그룹간에 데이터 집합을 복사하는 것은 예를 들어 hf1.get ( "g1"). id를 사용하여 해당 그룹의 ID를 제공하여 수행 할 수 있습니다.
지정된 이름의 개체가 대상 위치에 이미있는 경우 h5py.h5o.copy는 예외 (중단되지 않음)로 실패합니다.
-
==============================
2.이것은 실제로 HDF5의 유스 케이스 중 하나입니다. 단일 파일에서 모든 데이터 세트에 액세스 할 수 있고 실제로 디스크에 저장되는 방법에 신경 쓰지 않으면 외부 링크를 사용할 수 있습니다. HDF5 웹 사이트에서 :
이것은 실제로 HDF5의 유스 케이스 중 하나입니다. 단일 파일에서 모든 데이터 세트에 액세스 할 수 있고 실제로 디스크에 저장되는 방법에 신경 쓰지 않으면 외부 링크를 사용할 수 있습니다. HDF5 웹 사이트에서 :
다음은 h5py에서 수행하는 방법입니다.
myfile = h5py.File('foo.hdf5','a') myfile['ext link'] = h5py.ExternalLink("otherfile.hdf5", "/path/to/resource")
주의 사항 : myfile을 열 때 기존 파일 인 경우 'a'로 열어야합니다. 'w'로 열면 해당 내용이 지워집니다.
모든 데이터 세트를 새 파일로 복사하는 것보다 훨씬 빠릅니다. otherfile.hdf5에 얼마나 빨리 액세스 할 수 있는지 모르겠지만 모든 데이터 세트에서 작동하는 것은 투명합니다. 즉, h5py는 foo.hdf5에있는 모든 데이터 세트를 보게됩니다.
-
==============================
3.공식 hdf5 도구에서 h5copy를 사용하여 비 파이썬 솔루션을 발견했습니다. h5copy는 hdf5 파일의 개별 지정된 데이터 세트를 다른 기존 hdf5 파일로 복사 할 수 있습니다.
공식 hdf5 도구에서 h5copy를 사용하여 비 파이썬 솔루션을 발견했습니다. h5copy는 hdf5 파일의 개별 지정된 데이터 세트를 다른 기존 hdf5 파일로 복사 할 수 있습니다.
누군가 python / h5py 기반 솔루션을 발견하면 그것에 대해 듣게되어 기쁩니다.
-
==============================
4.저는 보통 ipython과 h5copy 툴을 사용합니다. 순수 python 솔루션에 비해 훨씬 빠릅니다. 일단 h5copy가 설치되었습니다.
저는 보통 ipython과 h5copy 툴을 사용합니다. 순수 python 솔루션에 비해 훨씬 빠릅니다. 일단 h5copy가 설치되었습니다.
#PLESE NOTE THIS IS IPYTHON CONSOLE CODE NOT PURE PYTHON import h5py #for every dataset Dn.h5 you want to merge to Output.h5 f = h5py.File('D1.h5','r+') #file to be merged h5_keys = f.keys() #get the keys (You can remove the keys you don't use) f.close() #close the file for i in h5_keys: !h5copy -i 'D1.h5' -o 'Output.h5' -s {i} -d {i}
폴더에서 작업 할 때 프로세스를 완전히 자동화하려면 병합 할 파일이 저장됩니다.
import os d_names = os.listdir(os.getcwd()) d_struct = {} #Here we will store the database structure for i in d_names: f = h5py.File(i,'r+') d_struct[i] = f.keys() f.close() # A) empty all the groups in the new .h5 file for i in d_names: for j in d_struct[i]: !h5copy -i '{i}' -o 'output.h5' -s {j} -d {j}
이전 데이터 세트를 output.h5 안에 별도로 보관하려면 먼저 -p 플래그를 사용하여 그룹을 만들어야합니다.
# B) Create a new group in the output.h5 file for every input.h5 file for i in d_names: dataset = d_struct[i][0] newgroup = '%s/%s' %(i[:-3],dataset) !h5copy -i '{i}' -o 'output.h5' -s {dataset} -d {newgroup} -p for j in d_struct[i][1:]: newgroup = '%s/%s' %(i[:-3],j) !h5copy -i '{i}' -o 'output.h5' -s {j} -d {newgroup}
-
==============================
5.HDF5 버전 1.10에서이를 업데이트하려면 "가상 데이터 세트"라는이 컨텍스트에서 유용 할 수있는 새로운 기능이 제공됩니다. 간단한 자습서와 몇 가지 설명이 있습니다. 가상 데이터 집합. 이 기능에 대한보다 완전하고 자세한 설명과 문서는 다음과 같습니다. Virtual Datasets extra doc. 그리고 여기 h5py에 병합 된 pull 요청이 포함되어 h5py에 가상 datatsets API가 포함됩니다. h5py 가상 데이터 세트 홍보하지만 현재 h5py 버전에서 이미 사용 가능한지 또는 나중에 올지 알 수 없습니다.
HDF5 버전 1.10에서이를 업데이트하려면 "가상 데이터 세트"라는이 컨텍스트에서 유용 할 수있는 새로운 기능이 제공됩니다. 간단한 자습서와 몇 가지 설명이 있습니다. 가상 데이터 집합. 이 기능에 대한보다 완전하고 자세한 설명과 문서는 다음과 같습니다. Virtual Datasets extra doc. 그리고 여기 h5py에 병합 된 pull 요청이 포함되어 h5py에 가상 datatsets API가 포함됩니다. h5py 가상 데이터 세트 홍보하지만 현재 h5py 버전에서 이미 사용 가능한지 또는 나중에 올지 알 수 없습니다.
from https://stackoverflow.com/questions/18492273/combining-hdf5-files by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] numpy를 사용한 하나의 핫 인코딩 (0) | 2018.10.31 |
---|---|
[PYTHON] Tkinter "X"버튼 컨트롤 재정의 (창을 닫는 버튼) [duplicate] (0) | 2018.10.31 |
[PYTHON] 터미널에서 파이썬 스크립트를 실행하면 아무것도 인쇄되지 않거나 나타나지 않습니다 - 왜? (0) | 2018.10.31 |
[PYTHON] Cython 모듈에서 #defined C 값을 Python에 어떻게 노출시킬 수 있습니까? (0) | 2018.10.31 |
[PYTHON] 인터프리터를 설치하지 않고 Perl / Python / Ruby 스크립트를 어떻게 배포 할 수 있습니까? (0) | 2018.10.31 |