복붙노트

[PYTHON] h5py로 점진적으로 hdf5에 씁니다.

PYTHON

h5py로 점진적으로 hdf5에 씁니다.

나는 python / h5py로 hdf5 파일에 쓰는 것이 가장 좋은 방법에 대한 질문을했습니다.

데이터가 있습니다.

-----------------------------------------
| timepoint | voltage1 | voltage2 | ...
-----------------------------------------
| 178       | 10       | 12       | ...
-----------------------------------------
| 179       | 12       | 11       | ...
-----------------------------------------
| 185       | 9        | 12       | ...
-----------------------------------------
| 187       | 15       | 12       | ...
                    ...

약 10 ^ 4 열과 약 10 ^ 7 열이 있습니다. (이것은 약 10 ^ 11 (1 천억 개) 요소 또는 1 바이트 정수가있는 ~ 100GB)입니다.

이 데이터를 사용하면 일반적으로 한 번만 쓰고 많은 시간을 읽고 일반적인 읽기 경우는 열 1과 다른 열 (예 : 254)을 가져 와서 두 열을 메모리에로드하고 멋진 통계를 작성하는 것입니다.

나는 좋은 hdf5 구조가 위 표의 각 열이 hdf5 그룹이되도록하여 10 ^ 4 그룹을 만들 것이라고 생각합니다. 그렇게하면 모든 데이터를 메모리에 읽을 필요가 없습니다. hdf5 구조체는 아직 정의되지 않았으므로 아무 것도 될 수 있습니다.

이제 질문 : 나는 한 번에 10 ^ 4 행의 데이터를 받고 (매번 정확히 같은 수의 행이 아님) hdf5 파일에 점진적으로 기록해야합니다. 파일을 어떻게 작성합니까?

나는 파이썬과 h5py를 고려하고 있지만 추천한다면 다른 도구 일 수있다. 예를 들면 다음과 같이 이동하는 방식입니다.

dset = f.create_dataset("voltage284", (100000,), maxshape=(None,), dtype='i8', chunks=(10000,))

그런 다음 10 ^ 4 행의 다른 블록이 도착하면 데이터 세트를 바꿉니 까?

또는 10 ^ 4 행의 각 블록을 개별 데이터 세트로 저장하는 것이 더 낫습니까? 아니면 실제로 행의 최종 개수를 알아야합니까? (그것은 얻는 것이 까다로울 것이지만 가능할 수도 있습니다).

어색한 글쓰기가 끝나면 멋진 일이 될 것이라고 생각하지만, hdf5에 대해서도 적절한 툴이 아니라면 보석금을 낼 수 있습니다.

해결법

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

    1.FAQ에 따라 dset.resize를 사용하여 데이터 세트를 확장 할 수 있습니다. 예를 들어,

    FAQ에 따라 dset.resize를 사용하여 데이터 세트를 확장 할 수 있습니다. 예를 들어,

    import os
    import h5py
    import numpy as np
    path = '/tmp/out.h5'
    os.remove(path)
    with h5py.File(path, "a") as f:
        dset = f.create_dataset('voltage284', (10**5,), maxshape=(None,),
                                dtype='i8', chunks=(10**4,))
        dset[:] = np.random.random(dset.shape)        
        print(dset.shape)
        # (100000,)
    
        for i in range(3):
            dset.resize(dset.shape[0]+10**4, axis=0)   
            dset[-10**4:] = np.random.random(10**4)
            print(dset.shape)
            # (110000,)
            # (120000,)
            # (130000,)
    
  2. ==============================

    2.@unutbu가 지적했듯이 dset.resize는 훌륭한 옵션입니다. 워크 플로우를 고려할 때 팬더와 HDF5 지원을 보는 것이 효과적 일 수 있습니다. HDF5는 사용자의 필요에 따라 합리적인 선택을하는 것처럼 들리지만 최상층에 추가 레이어를 사용하면 문제가 더 잘 표현 될 수 있습니다.

    @unutbu가 지적했듯이 dset.resize는 훌륭한 옵션입니다. 워크 플로우를 고려할 때 팬더와 HDF5 지원을 보는 것이 효과적 일 수 있습니다. HDF5는 사용자의 필요에 따라 합리적인 선택을하는 것처럼 들리지만 최상층에 추가 레이어를 사용하면 문제가 더 잘 표현 될 수 있습니다.

    고려해야 할 중요한 점은 데이터의 방향입니다. 주로 읽기에 관심이 있고 기본적으로 열 단위로 데이터를 가져 오는 경우 HDF5가 행 우선 순서로 저장되므로 행 단위로 읽을 수 있도록 데이터를 조 변경해야하는 것처럼 들립니다.

  3. from https://stackoverflow.com/questions/25655588/incremental-writes-to-hdf5-with-h5py by cc-by-sa and MIT license