복붙노트

[PYTHON] hdf5 파일 결합

PYTHON

hdf5 파일 결합

각 hdf5 파일에는 단일 데이터 세트가 있습니다. 데이터 세트가 너무 커서 RAM에 보관할 수 없습니다. 이 파일들을 하나의 파일에 결합하여 모든 데이터 세트를 별도로 포함하고 싶습니다. 즉, 데이터 세트를 단일 데이터 세트로 연결하지 마십시오.

한 가지 방법은 hdf5 파일을 만든 다음 데이터 세트를 하나씩 복사하는 것입니다. 이것은 버퍼링 된 사본이 필요하기 때문에 느리고 복잡 할 것입니다.

이 작업을 수행하는보다 간단한 방법이 있습니까? 본질적으로 컨테이너 파일을 생성하기 때문에 존재해야하는 것처럼 보입니다.

나는 python / h5py를 사용하고있다.

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.공식 hdf5 도구에서 h5copy를 사용하여 비 파이썬 솔루션을 발견했습니다. h5copy는 hdf5 파일의 개별 지정된 데이터 세트를 다른 기존 hdf5 파일로 복사 할 수 있습니다.

    공식 hdf5 도구에서 h5copy를 사용하여 비 파이썬 솔루션을 발견했습니다. h5copy는 hdf5 파일의 개별 지정된 데이터 세트를 다른 기존 hdf5 파일로 복사 할 수 있습니다.

    누군가 python / h5py 기반 솔루션을 발견하면 그것에 대해 듣게되어 기쁩니다.

  4. ==============================

    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. ==============================

    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 버전에서 이미 사용 가능한지 또는 나중에 올지 알 수 없습니다.

  6. from https://stackoverflow.com/questions/18492273/combining-hdf5-files by cc-by-sa and MIT license