파이썬 대용량 데이터 저장 HDF5와 h5py 핵심 가이드 압축 청크 메타데이터 병렬 I O까지
📌 HDF5 파일 구조부터 h5py 사용법, 압축·청크·임의 접근·메타데이터 관리, MPI 기반 병렬 I O 고려사항까지 한 번에 정리합니다
파이썬으로 수십 GB짜리 배열이나 센서 로그, 실험 결과를 다루다 보면 CSV나 피클로는 한계가 금세 드러납니다.
메모리에 다 못 올리니까 분석이 버벅이고, 매번 전체 파일을 다시 저장하는 것도 비효율적이죠.
그래서 연구나 머신러닝 현장 쪽에서 꾸준히 쓰는 게 바로 HDF5라는 포맷입니다.
HDF5는 대용량 수치 데이터를 디스크에 구조적으로 보관하면서도 원하는 부분만 골라서 읽을 수 있고, 데이터에 설명(메타데이터)까지 같이 넣을 수 있게 설계된 포맷입니다.
파이썬에서는 h5py라는 라이브러리로 HDF5 파일을 다루게 되는데, h5py에서는 File, Group, Dataset이라는 개념만 이해하면 꽤 바로 응용이 가능합니다.
또 한 가지 현실적으로 중요한 포인트는 속도와 I/O 자원입니다.
데이터를 한 컴퓨터에서만 쓰는 게 아니라 HPC 클러스터나 여러 프로세스에서 동시에 다뤄야 할 때가 많잖아요.
이때는 HDF5의 병렬 I/O 기능과 MPI 기반 빌드를 고려해야 한다는 점도 반드시 짚고 넘어가야 합니다.
이 글에서는 HDF5와 h5py가 어떤 구조인지, 왜 단순한 바이너리 덤프나 CSV보다 나은지, 압축과 청크(chunk) 설정이 저장 공간과 속도에 어떤 영향을 주는지, 대규모 배열에서 임의 접근(random access)이 왜 중요한지, 그리고 병렬 I/O를 쓰려면 어떤 준비가 필요한지를 순서 있게 풀어보려고 합니다.
현업 데이터 처리 경험이 없더라도 이해할 수 있도록, 복잡한 HPC 용어는 최대한 풀어서 설명하겠습니다.
일단 전제가 되는 핵심부터 정리해볼게요.
HDF5는 계층 구조를 가진 컨테이너 포맷이라서, 하나의 파일 안에 여러 그룹(Group)과 데이터셋(Dataset)을 폴더처럼 정리해둘 수 있습니다.
각 데이터셋은 넘파이 배열처럼 다차원 수치를 담고 있고, 여기에 압축 옵션과 청크 단위 저장 방식을 붙여줄 수 있어서 디스크 용량을 줄이면서도 필요한 조각만 빠르게 읽을 수 있습니다.
또한 메타데이터(속성)까지 같은 파일 안에 보존할 수 있기 때문에, “이 값이 어떤 단위인지”, “측정 장비는 뭔지” 같은 컨텍스트를 잊어버리지 않게 해줍니다.
마지막으로, MPI로 빌드된 HDF5와 h5py 조합은 여러 프로세스가 한 파일에 병렬로 접근하는 병렬 I/O까지 지원합니다.
다만 이건 일반 설치본 h5py로는 바로 안 될 수 있고, MPI 지원 빌드를 명시적으로 준비해야 한다는 점이 자주 간과됩니다.
한마디로 요약하면,
파이썬에서 HDF5를 h5py로 다룬다는 건 단순히 “파일에 배열 저장” 수준을 넘어서
압축·청크·임의 접근·메타데이터·병렬 I/O까지 포함한
데이터 아카이빙 전략을 설계한다는 얘기와 가깝습니다.
그리고 이런 구조화를 잘해두면, 분석 파이프라인이 커질수록 오히려 유지보수가 편해집니다.
📋 목차
📌 HDF5와 h5py 기본 구조 File Group Dataset 이해하기
HDF5는 한마디로 말해 대용량 과학 데이터 전용 컨테이너입니다.
하나의 파일 안에 여러 개의 배열, 표, 이미지 성격의 데이터를 논리적으로 나눠 담을 수 있고, 각각의 데이터에 대한 설명(속성)까지 같이 기록할 수 있습니다.
이 구조 덕분에 연구용 실험 결과, 센서 로그, 시뮬레이션 출력처럼 크고 복잡한 데이터를 한 파일에서 체계적으로 관리할 수 있습니다.
CSV처럼 컬럼만 잔뜩 늘어나는 평면 구조가 아니라 폴더 트리처럼 계층 구조로 정리된다는 점이 핵심입니다.
📌 File 객체는 루트이자 진입점
h5py에서 File 객체는 말 그대로 HDF5 파일을 여는 창구입니다.
파이썬 코드에서 h5py.File(“data.h5”, “w”)처럼 호출하면 새로운 HDF5 파일이 생성되고, “r”이면 읽기 전용으로 엽니다.
이 File 객체는 단순한 파일 핸들 역할만 하는 게 아니라, HDF5 계층 구조의 최상단 그룹(/)처럼 동작합니다.
즉, File은 HDF5의 루트 그룹을 그대로 가지고 있어서, 이후에 만들 Group이나 Dataset에 접근하는 출발점이 됩니다.
이 관점에서 보면 HDF5 파일은 단순한 “한 개의 큰 배열 덩어리”가 아니라, 미니 파일시스템처럼 작동한다고 생각하는 게 이해가 훨씬 편합니다.
import h5py
import numpy as np
# 새 HDF5 파일 생성 (쓰기 모드)
f = h5py.File("example.h5", "w")
# 루트 아래에 그룹 생성
grp = f.create_group("experiment1")
# 그룹 안에 Dataset 생성 (넘파이 배열 저장)
data = np.random.rand(100, 64)
dset = grp.create_dataset("signal", data=data)
# 파일 닫기
f.close()
위 코드에서 “example.h5″는 단일 파일인데, 그 안에는 experiment1이라는 그룹과 signal이라는 데이터셋이 트리 형태로 정리돼 있습니다.
파일 바깥에서 폴더 여러 개, npy 여러 개 관리할 필요 없이 한 덩어리로 묶인다는 점이 엄청 편합니다.
📌 Group은 폴더처럼, Dataset은 다차원 배열처럼
Group은 HDF5 안에서 데이터를 정리하는 컨테이너입니다.
운영체제의 폴더(디렉터리)라고 생각하면 거의 똑같습니다.
그룹 안에는 또 다른 하위 그룹을 넣을 수도 있고, 실제 숫자 데이터를 담는 Dataset을 넣을 수도 있습니다.
파이썬에서 보면 Group은 딕셔너리처럼 동작해서 grp[“signal”] 같은 키 접근으로 내부 객체에 접근할 수 있습니다.
Dataset은 실제 값이 들어 있는 다차원 배열입니다.
넘파이 배열과 매우 비슷하게 shape, dtype을 가지고 있고 슬라이싱으로 특정 구간만 읽을 수도 있습니다.
예를 들면 dset[0:10, 0:32]처럼 부분 슬라이스로 접근하면, 필요한 조각만 디스크에서 읽어오므로 전체 데이터를 메모리에 다 올릴 필요가 없습니다.
이건 “TB 단위 데이터에서 앞쪽 1초만 보고 싶다” 같은 요구에 정말 치명적으로 중요한 기능입니다.
그리고 이런 부분 접근이 가능하다는 건, 나중에 모델 학습할 때 배치 단위로 샘플만 뽑아오기에도 적합하다는 뜻이기도 합니다.
📌 메타데이터는 속성(Attribute)으로 저장된다
HDF5의 또 다른 장점은 각 Group이나 Dataset에 자유롭게 속성(attribute)을 붙일 수 있다는 점입니다.
예를 들어 “이 데이터는 어떤 장비로, 어느 실험 조건에서 측정했는가”, “단위는 무엇인가”, “전처리 단계는 뭐였는가” 같은 정보를 문자열이나 숫자 형태로 딱 붙여둘 수 있습니다.
결국 이건 분석 재현성과 직결됩니다.
나중에 파일만 열어봐도 데이터의 의미를 복원할 수 있으니까, 따로 README를 잃어버릴 걱정이 줄어듭니다.
with h5py.File("example.h5", "a") as f:
dset = f["experiment1/signal"]
dset.attrs["sampling_rate_hz"] = 48000
dset.attrs["sensor"] = "mic_A01"
dset.attrs["note"] = "gain +6dB, room temp 24C"
이렇게 Dataset에 붙인 attrs 정보는 HDF5 파일 안에 같이 저장됩니다.
즉, 데이터랑 설명이 한 몸으로 묶여서 이동하니까 협업이나 장기 보관용 포맷으로도 안정적입니다.
📌 HDF5가 과학·ML 워크플로에서 사랑받는 이유
정리하면 h5py를 통한 HDF5 활용은 다음 같은 요구에 잘 맞습니다.
- 🗂️하나의 파일에 여러 실험/세션/샘플을 트리 구조로 관리하고 싶다.
- 📏각 데이터셋마다 단위, 장비, 전처리 이력을 잃지 않고 같이 저장하고 싶다.
- 🚀TB 단위 데이터에서도 필요한 구간만 슬라이스해서 바로 읽고 싶다. (메모리 전체 로드 없이)
- 💾압축과 청크 단위 저장으로 디스크 용량과 I/O 시간을 관리하고 싶다. 이 부분은 이후 섹션에서 구체적으로 다룬다.
과학 데이터 형식 HDF5 위에, 특정 도메인(예: 분자 시뮬레이션, 신경과학 등)에서 표준 레이아웃을 정해둔 서브포맷도 존재합니다.
예를 들어 H5MD 같은 경우 시뮬레이션된 입자 위치, 속도, 온도 같은 물리량을 구조화해서 담는 규약을 제공하며, 공통 구조를 쓰면 서로 다른 연구자나 도구 간에도 데이터를 쉽게 공유할 수 있다는 장점이 있습니다.
이건 단순히 “파일 하나에 다 넣을 수 있다” 수준을 넘어서, 협업과 재현성까지 염두에 둔 저장 전략이라는 점에서 의미가 큽니다.
💡 TIP: HDF5는 결국 “파일 안에 폴더와 배열을 마음대로 설계할 수 있는 구조화된 데이터베이스”라는 감각으로 접근하면 편합니다.
파이썬에서는 h5py.File → Group → Dataset 순서로 계층을 만든다고 이해해두면 이후 압축, 청크, 병렬 I/O 같은 고급 기능도 자연스럽게 연결됩니다.
📌 압축과 청크 설정으로 디스크와 속도 최적화하기
HDF5의 강력한 장점 중 하나는 데이터를 단순히 “저장”하는 게 아니라 효율적으로 저장할 수 있다는 점입니다.
대용량 데이터를 그대로 덤프하면 파일이 금세 수십 GB를 넘기고, 읽고 쓰는 데도 시간이 오래 걸리지만 HDF5는 압축(Compression)과 청크(Chunking)라는 두 가지 기술로 이 문제를 풀어냅니다.
📌 압축(Compression)으로 용량 줄이기
압축은 HDF5 Dataset 생성 시 옵션으로 지정합니다.
대표적으로 많이 쓰는 방법은 gzip 압축이며, “compression=’gzip’” 옵션을 주면 내부적으로 zlib 기반 압축이 적용됩니다.
압축 수준(level)을 1~9 사이에서 조정할 수 있고, 숫자가 높을수록 압축률이 커지는 대신 CPU 부하가 조금 늘어납니다.
대체로 분석용 데이터에서는 level 4~6 정도면 용량 대비 속도 균형이 좋습니다.
import h5py
import numpy as np
data = np.random.rand(1000, 1000)
with h5py.File("compressed.h5", "w") as f:
f.create_dataset(
"image",
data=data,
compression="gzip",
compression_opts=5 # 압축 수준 (1~9)
)
압축된 Dataset은 디스크 상에서는 훨씬 작지만, 읽을 때는 자동으로 해제되어 넘파이 배열로 반환됩니다.
사용자 입장에서는 코드 상 차이가 없고, 내부에서 I/O 효율이 개선되는 셈입니다.
💎 핵심 포인트:
압축을 걸면 저장 속도는 약간 느려지지만, 디스크 I/O 속도 자체가 줄어들기 때문에 전체 처리 속도가 오히려 빨라지는 경우가 많습니다.
특히 SSD가 아닌 HDD 환경에서는 gzip 압축이 체감상 큰 도움이 됩니다.
📌 청크(Chunk)로 빠른 임의 접근 실현
청크는 데이터를 일정 크기의 블록 단위로 나눠서 저장하는 방식입니다.
예를 들어 1000×1000 배열을 100×100 단위로 잘라 저장하면, 일부만 읽을 때 해당 블록만 디스크에서 가져오면 되죠.
즉, 청크는 HDF5의 부분 읽기 효율을 결정하는 핵심입니다.
with h5py.File("chunked.h5", "w") as f:
f.create_dataset(
"data",
shape=(1000, 1000),
dtype="float32",
chunks=(100, 100), # 청크 크기 지정
compression="gzip",
compression_opts=4
)
청크 크기를 잘 정하면 임의 접근 속도와 저장 효율을 모두 잡을 수 있습니다.
너무 작게 하면 청크가 많아져서 인덱싱 비용이 커지고, 너무 크면 필요한 조각만 읽을 때도 큰 블록이 통째로 읽히기 때문에 비효율이 생깁니다.
일반적으로 메모리에 한 번에 로드 가능한 배열 블록 크기(예: 수 MB 단위)로 맞추면 좋습니다.
📌 압축과 청크를 함께 쓸 때 주의할 점
압축과 청크는 항상 세트로 동작합니다.
HDF5는 전체 Dataset을 통째로 압축하지 않고, 각 청크 단위로 압축합니다.
그래서 청크 크기와 압축률이 서로 영향을 주며, 최적의 조합을 찾는 게 중요합니다.
보통 다음과 같은 원칙이 도움이 됩니다.
- 🧩청크 크기는 데이터 접근 패턴(예: 슬라이싱 단위)에 맞춘다.
- 📉압축률이 너무 높으면 CPU 부하 증가로 읽기 속도가 느려질 수 있다.
- ⚙️작업 환경이 SSD인지 HDD인지, I/O 병목이 어디인지 고려해 설정한다.
⚠️ 주의: Dataset 생성 후에는 압축·청크 설정을 변경할 수 없습니다.
설정 실수로 파일을 다시 만들어야 하는 경우가 많으니, 저장 전에 설계를 명확히 정해두세요.
압축과 청크 기능을 잘 활용하면 HDF5 파일 크기를 70% 이상 줄이면서도 읽기 성능은 유지하거나 오히려 향상시킬 수 있습니다.
이건 단순히 저장 공간 문제를 넘어, 분석 파이프라인의 속도와 안정성까지 좌우하는 중요한 설계 포인트입니다.
📌 임의 접근 가능한 대용량 배열 포맷으로 쓰는 이유
HDF5가 과학 데이터, 머신러닝, 시뮬레이션 로그 등에서 사랑받는 이유 중 하나는 바로 임의 접근(Random Access) 기능입니다.
이건 단순히 “필요한 부분만 읽는다” 수준이 아니라, TB급 데이터를 효율적으로 다루는 핵심 기술입니다.
보통 CSV나 피클은 파일 전체를 한 번에 메모리에 올려야 내용을 확인할 수 있지만, HDF5는 그렇지 않습니다.
청크 단위로 저장되어 있기 때문에 필요한 구간만 선택해서 로드할 수 있습니다.
예를 들어 음성 데이터 10시간 분량 중 앞의 10분만 분석할 수도 있고, 이미지 100,000장 중 100장만 무작위로 읽을 수도 있죠.
이는 모델 학습 시 배치(batch) 단위 데이터를 불러올 때 특히 유용합니다.
📌 슬라이싱(Slicing)으로 필요한 구간만 읽기
h5py에서 Dataset은 넘파이 배열처럼 동작하므로 슬라이싱 문법을 그대로 쓸 수 있습니다.
즉, dset[0:10, :]처럼 지정하면 파일의 해당 부분만 디스크에서 읽어옵니다.
이때 실제로는 디스크 I/O가 필요한 청크만 접근하므로 전체를 읽는 것보다 훨씬 빠르게 작동합니다.
import h5py
with h5py.File("chunked.h5", "r") as f:
dset = f["data"]
small = dset[0:100, 0:50] # 필요한 일부만 읽기
print(small.shape)
위 예제에서처럼 필요한 구간만 로드하므로, 메모리 사용량이 대폭 줄어듭니다.
이는 데이터 크기가 커질수록 체감이 큽니다.
실제로 수 GB~TB급 데이터셋에서도 HDF5는 전체를 읽지 않고 필요한 청크만 처리하므로, 디스크 I/O 병목을 최소화할 수 있습니다.
📌 랜덤 접근(Random I/O)의 실제 예시
딥러닝 모델 학습을 예로 들어보면, 보통 한 번에 전체 데이터를 메모리에 올리기 어렵습니다.
이때 HDF5는 배치 인덱스만큼 슬라이싱해서 랜덤하게 데이터를 읽을 수 있습니다.
즉, 데이터로더가 “필요한 인덱스 구간”만 즉시 불러오는 식으로 작동하는 겁니다.
import numpy as np
import h5py
with h5py.File("dataset.h5", "r") as f:
dset = f["images"]
batch_indices = np.random.randint(0, dset.shape[0], size=32)
batch = dset[batch_indices, ...] # 랜덤 인덱스로 접근
이처럼 Dataset은 넘파이의 fancy indexing까지 지원하므로, 미니배치 학습 루프에 그대로 적용할 수 있습니다.
단, 완전히 무작위 접근을 반복적으로 수행할 경우에는 디스크 캐시 효율이 떨어질 수 있으므로, 학습용 파이프라인에서는 버퍼링이나 프리페치(prefetch)를 함께 사용하는 게 좋습니다.
📌 임의 접근이 주는 실제 이점
- ⚡메모리 절약: 필요한 조각만 읽기 때문에 GB~TB 데이터도 처리 가능.
- 🚀속도 향상: 디스크 I/O 횟수가 줄어 병목을 완화.
- 🔁모델 학습 효율: 배치별 데이터 호출에 최적화.
- 🧩부분 처리 가능: 분석 대상 구간만 따로 읽고 저장할 수 있음.
이 기능들은 결국 HDF5의 청크 구조와 내부 인덱싱 메커니즘 덕분에 가능해집니다.
즉, 압축과 청크를 잘 설정해둔 Dataset은 대규모 데이터를 빠르고 안정적으로 다룰 수 있는 기반이 됩니다.
결국 “임의 접근”은 단순한 편의 기능이 아니라, 대용량 데이터 효율성을 좌우하는 필수 설계 요소입니다.
💡 TIP: HDF5를 데이터베이스처럼 다루려면 청크 단위를 고려해 Dataset을 설계하세요.
임의 접근 효율은 저장 구조(청크 크기)와 직접적으로 연관되므로, 분석 패턴에 맞춰 조정하는 게 성능의 핵심입니다.
📌 실험 정보까지 담는 메타데이터 관리 방식
HDF5의 진정한 강점은 단순히 숫자 배열을 저장하는 게 아니라, 데이터에 대한 맥락(Context)을 함께 보존할 수 있다는 점입니다.
이걸 가능하게 하는 게 바로 메타데이터(Metadata)입니다.
h5py에서는 각 Group이나 Dataset에 속성을 추가해 이런 정보를 직접 기록할 수 있습니다.
예를 들어 실험 데이터를 저장할 때, 단위, 장비 이름, 날짜, 전처리 단계 같은 정보를 함께 기록해두면 나중에 누가 열어보더라도 그 데이터의 의미를 정확히 이해할 수 있습니다.
이는 단순한 ‘메모’ 수준이 아니라, 연구 재현성(reproducibility)과 협업 품질에 직결되는 중요한 부분입니다.
📌 Attribute를 이용한 메타데이터 저장
HDF5에서는 각 객체마다 attrs라는 딕셔너리 같은 속성을 가지고 있습니다.
이를 통해 간단하게 메타데이터를 추가할 수 있습니다.
문자열, 숫자, 배열 등 거의 모든 기본 자료형을 지원하며, 파일 안에 함께 저장되기 때문에 별도의 외부 문서가 필요 없습니다.
import h5py
with h5py.File("experiment_meta.h5", "w") as f:
grp = f.create_group("experiment_01")
dset = grp.create_dataset("signal", (1000,), dtype="float32")
# 메타데이터 추가
dset.attrs["unit"] = "mV"
dset.attrs["device"] = "EEG-Recorder-3A"
dset.attrs["sampling_rate"] = 48000
grp.attrs["operator"] = "Dr. Kim"
grp.attrs["date"] = "2025-10-29"
이 예시에서는 데이터셋과 그룹 각각에 속성을 추가했습니다.
이처럼 Dataset 수준 메타데이터는 측정 장비, 단위, 스케일 정보처럼 수치와 직접 연관된 내용을 담고,
Group 수준 메타데이터는 실험 날짜, 담당자, 환경 조건처럼 상위 맥락을 담는 식으로 분리해 관리하는 게 좋습니다.
📌 메타데이터를 활용한 자동 분석 환경 구축
이렇게 기록된 메타데이터는 단순 참고용을 넘어 자동화된 데이터 파이프라인에서도 활용됩니다.
예를 들어 “sampling_rate가 48000인 데이터만 읽기”, “device 속성이 ‘EEG’인 그룹만 분석하기” 같은 조건 필터링이 가능합니다.
즉, 파일 스캔 없이 내부 구조 탐색으로 필요한 데이터만 추출할 수 있습니다.
또한, HDF5는 하이어라키 구조를 유지하므로 “/experiment_01/signal”처럼 경로를 통해 데이터에 접근할 수 있습니다.
이 경로는 일종의 데이터베이스 키 역할을 해주며, 여러 실험 결과를 한 파일 안에 체계적으로 정리할 수 있게 해줍니다.
📌 메타데이터 설계 시 주의할 점
HDF5의 메타데이터는 매우 유용하지만, 잘못 설계하면 나중에 유지보수가 어렵습니다.
다음은 실무에서 자주 겪는 주의사항입니다.
- 🧾속성 키 이름을 일관되게 유지해야 합니다. (예: “unit”, “sampling_rate”)
- 🕒날짜나 시간은 문자열로 기록하되, 표준 형식(YYYY-MM-DD)을 따릅니다.
- 📦리스트형 데이터를 attrs에 직접 넣을 수 있지만, JSON 문자열로 변환해 저장하면 더 호환성이 좋습니다.
- ⚙️필수 메타데이터(예: 단위, 날짜, 데이터 출처)는 항상 초기 저장 시 자동으로 기록되도록 스크립트화하세요.
⚠️ 주의: 메타데이터는 파일 구조를 바꾸지 않고도 수정이 가능하지만, 너무 자주 변경하면 파일 무결성에 영향을 줄 수 있습니다.
가능한 한 저장 직후 완성된 형태로 관리하는 것이 좋습니다.
정리하면, HDF5의 메타데이터 기능은 단순한 설명 필드가 아니라 데이터 자체의 일부분입니다.
데이터 + 문서 + 환경 정보를 한 번에 보존할 수 있다는 점에서, HDF5는 실험 데이터 관리의 표준 포맷으로 자리 잡았습니다.
💡 TIP: HDF5 메타데이터는 단순히 보조 설명이 아니라, 향후 자동화된 분석이나 데이터 품질 검증 단계에서 핵심 필터 조건으로도 활용됩니다.
이 점을 염두에 두고 초기에 구조를 설계하면 장기적으로 큰 이점을 얻을 수 있습니다.
📌 병렬 I O와 MPI 빌드가 필요한 상황과 주의할 점
데이터가 커지고 계산 규모가 커질수록, 한 프로세스에서 파일을 읽고 쓰는 방식만으로는 한계가 옵니다.
이럴 때 HDF5가 제공하는 병렬 I/O(Parallel I/O) 기능이 빛을 발합니다.
HDF5는 MPI(Message Passing Interface)를 기반으로 병렬 읽기·쓰기를 지원하며, 여러 프로세스가 동시에 하나의 HDF5 파일에 접근할 수 있도록 설계되어 있습니다.
단, 여기서 중요한 점은 일반적으로 설치한 h5py는 병렬 I/O를 지원하지 않는다는 것입니다.
병렬 기능을 쓰려면 HDF5와 h5py를 모두 MPI 지원 옵션으로 빌드해야 합니다.
이 빌드는 일반 버전보다 설정이 까다롭지만, HPC(고성능 컴퓨팅) 환경에서는 필수적인 과정입니다.
📌 MPI 빌드로 병렬 I/O 환경 구성하기
HDF5를 병렬로 빌드하려면 먼저 시스템에 MPI 라이브러리(OpenMPI 또는 MPICH)가 설치되어 있어야 합니다.
그 다음, HDF5를 –enable-parallel 옵션으로 컴파일하고, h5py를 MPI 버전으로 다시 빌드해야 합니다.
# HDF5 설치 (MPI 지원)
./configure --enable-parallel --prefix=/usr/local/hdf5-mpi CC=mpicc
make -j
make install
# h5py 설치 (MPI 빌드)
export CC=mpicc
HDF5_DIR=/usr/local/hdf5-mpi pip install --no-binary=h5py h5py
이후 파이썬에서 다음과 같이 사용할 수 있습니다.
이 코드는 여러 프로세스가 동시에 데이터를 HDF5 파일에 병렬로 저장하는 예시입니다.
from mpi4py import MPI
import h5py
import numpy as np
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
with h5py.File("parallel_example.h5", "w", driver="mpio", comm=comm) as f:
dset = f.create_dataset("data", (4, 100), dtype="float64")
dset[rank, :] = np.arange(100) * (rank + 1)
이 코드는 4개의 프로세스가 병렬로 하나의 파일을 쓰는 구조입니다.
각 프로세스는 자신만의 rank 인덱스에 데이터를 저장하며, 전체 데이터는 동시에 기록됩니다.
즉, 파일을 분할 저장하고 나중에 합치는 번거로움 없이 한 번에 병렬 입출력이 가능합니다.
📌 병렬 I/O 사용 시 주의사항
병렬 HDF5는 강력하지만, 설정이 복잡하고 일반적인 로컬 환경에서는 다소 제약이 있습니다.
다음 사항을 반드시 체크해야 합니다.
- ⚙️HDF5, h5py, MPI4Py 모두 동일한 MPI 환경에서 빌드되어야 함.
- 📁병렬 모드에서는 파일 잠금(lock)이 OS에 따라 다르게 작동하므로, NFS나 SMB 네트워크 드라이브에서는 충돌이 날 수 있음.
- 🔄파일 생성 모드(“w”)는 모든 프로세스가 동시에 호출해야 하며, 일부만 열면 deadlock이 발생할 수 있음.
- 🧩읽기 전용(“r”) 접근 시에도 모든 프로세스가 같은 시점에 open/close 해야 데이터 일관성이 유지됨.
⚠️ 주의: 병렬 HDF5는 멀티스레드(Thread) 환경과는 다릅니다.
MPI 기반 병렬 입출력은 멀티프로세스 간 협업을 위한 기능이며, GIL을 회피하려는 용도는 아닙니다.
📌 병렬 I/O가 필요한 상황 정리
병렬 I/O는 모든 프로젝트에 필요한 건 아니지만, 다음과 같은 상황이라면 고려할 가치가 충분합니다.
- 🏗️고성능 컴퓨팅(HPC) 클러스터 환경에서 수백 GB 이상의 데이터를 여러 프로세스가 동시에 처리할 때
- 📊시뮬레이션이나 CFD(전산유체역학) 등 대규모 과학 계산 결과를 실시간으로 저장해야 할 때
- 🧠딥러닝 학습에서 여러 노드가 동시에 HDF5 파일을 읽어야 하는 분산 학습 구조일 때
즉, 일반적인 단일 PC 환경에서는 굳이 MPI 버전을 빌드하지 않아도 되지만,
연산 병렬화나 데이터 병렬 처리가 핵심인 HPC·AI 워크로드에서는 MPI 빌드가 사실상 필수입니다.
이 구조를 미리 이해하고 설계해두면, 이후 확장성 있는 데이터 파이프라인을 구현하는 데 큰 도움이 됩니다.
💡 TIP: 병렬 HDF5는 “한 파일에 모든 프로세스가 동시에 접근”하는 구조이기 때문에, 데이터 분할 및 재조합 로직을 따로 짤 필요가 없습니다.
이로써 대규모 데이터 입출력의 효율성과 일관성을 모두 확보할 수 있습니다.
❓ 자주 묻는 질문 FAQ
HDF5와 h5py는 어떤 관계인가요?
즉, h5py는 HDF5의 기능을 파이썬 객체 형태로 쉽게 다루게 해주는 래퍼(wrapper)라고 볼 수 있습니다.
압축을 걸면 읽기 속도가 느려지지 않나요?
특히 SSD보다 느린 HDD 환경에서는 gzip 압축이 큰 도움이 됩니다.
HDF5 파일 안에 여러 Dataset을 넣어도 되나요?
HDF5는 계층 구조를 지원하므로, 하나의 파일에 여러 그룹(Group)과 데이터셋(Dataset)을 폴더처럼 정리해서 저장할 수 있습니다.
실험별, 세션별, 버전별로 나누어 관리하면 훨씬 효율적입니다.
메타데이터는 어디에 저장되나요?
attrs 속성으로 저장됩니다.이는 HDF5 파일 내부에 함께 보관되어, 파일만으로도 모든 속성과 데이터의 의미를 알 수 있게 합니다.
병렬 I/O를 쓰려면 꼭 MPI 빌드가 필요한가요?
일반적으로 설치된 h5py는 병렬 I/O를 지원하지 않습니다.
병렬 입출력을 위해서는 MPI 기반으로 HDF5와 h5py를 모두 다시 빌드해야 합니다.
HDF5 파일을 CSV로 변환할 수 있나요?
h5py로 Dataset을 읽어 넘파이 배열로 변환한 뒤, pandas나 numpy를 이용해 CSV로 저장할 수 있습니다.
다만 CSV는 계층 구조나 메타데이터를 표현하지 못하므로 일부 정보는 손실됩니다.
Dataset 크기를 나중에 늘릴 수 있나요?
Dataset을 만들 때
maxshape 속성을 지정하면 동적으로 크기를 확장할 수 있습니다.예를 들어
maxshape=(None, 100)로 지정하면 행 방향으로 데이터 추가가 가능합니다.
h5py와 pandas의 HDFStore는 같은 건가요?
h5py는 HDF5를 훨씬 세밀하게 제어할 수 있으며, 더 복잡한 데이터 구조나 병렬 처리에도 적합합니다.
📌 파이썬 HDF5 활용 핵심 정리 압축 청크 메타데이터 병렬 I O까지
지금까지 살펴본 것처럼 HDF5는 단순한 데이터 저장 포맷을 넘어, 대용량 과학 데이터나 머신러닝 훈련 데이터를 효율적으로 관리할 수 있는 강력한 시스템입니다.
파이썬에서는 h5py를 이용해 이 모든 기능을 직관적으로 다룰 수 있습니다.
핵심은 File·Group·Dataset 구조를 이해하고, 압축과 청크 설정을 통해 I/O 효율을 최적화하는 것입니다.
또한, 메타데이터를 잘 설계하면 데이터의 의미와 실험 정보를 한 파일 안에서 완벽히 추적할 수 있으며, MPI 기반 병렬 I/O는 고성능 환경에서 데이터 병목을 해결하는 열쇠가 됩니다.
즉, HDF5와 h5py는 ‘빠르고 안전한 데이터 아카이빙’을 가능하게 하는 필수 도구입니다.
올바르게 설계된 HDF5 파일은 수년 뒤에도 분석 재현성을 유지하고, 다른 연구자나 시스템과도 손쉽게 공유할 수 있습니다.
데이터의 크기가 커질수록, 이런 구조적 접근의 중요성은 더 커집니다.
파일 하나에도 철학이 깃들 수 있다는 점에서 HDF5는 단순한 저장 형식이 아니라, 데이터 과학의 기본기라 할 수 있습니다.
🏷️ 관련 태그 : HDF5, h5py, 데이터직렬화, 파이썬파일포맷, 병렬IO, MPI빌드, 데이터압축, 청크저장, 메타데이터관리, 대용량데이터