[PYTHON] h5py로 점진적으로 hdf5에 씁니다.
PYTHONh5py로 점진적으로 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.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.@unutbu가 지적했듯이 dset.resize는 훌륭한 옵션입니다. 워크 플로우를 고려할 때 팬더와 HDF5 지원을 보는 것이 효과적 일 수 있습니다. HDF5는 사용자의 필요에 따라 합리적인 선택을하는 것처럼 들리지만 최상층에 추가 레이어를 사용하면 문제가 더 잘 표현 될 수 있습니다.
@unutbu가 지적했듯이 dset.resize는 훌륭한 옵션입니다. 워크 플로우를 고려할 때 팬더와 HDF5 지원을 보는 것이 효과적 일 수 있습니다. HDF5는 사용자의 필요에 따라 합리적인 선택을하는 것처럼 들리지만 최상층에 추가 레이어를 사용하면 문제가 더 잘 표현 될 수 있습니다.
고려해야 할 중요한 점은 데이터의 방향입니다. 주로 읽기에 관심이 있고 기본적으로 열 단위로 데이터를 가져 오는 경우 HDF5가 행 우선 순서로 저장되므로 행 단위로 읽을 수 있도록 데이터를 조 변경해야하는 것처럼 들립니다.
from https://stackoverflow.com/questions/25655588/incremental-writes-to-hdf5-with-h5py by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 어떻게 장고에서 파이썬을 사용하여 응용 프로그램 이름을 얻는 지 (0) | 2018.11.24 |
---|---|
[PYTHON] 모든 문자열이나 정규 표현식이 파일에 존재하는지 확인 (0) | 2018.11.24 |
[PYTHON] Django 템플릿에서 키로 사전 접근하기 (0) | 2018.11.24 |
[PYTHON] 파이썬 : 객체 속성 참조 메소드 호출 방법 (0) | 2018.11.23 |
[PYTHON] PySpark 데이터 프레임에 새로운 열로 열 합계를 추가하십시오. (0) | 2018.11.23 |