2012-06-25 2 views
15

나는 SO 사용자가 이전에이 question을 요청했지만 2009 년에 질문을 받았으며 HDF5에 대한 더 많은 지식이 필요하거나 새로운 버전에서이 특정 문제가 해결되기를 바랬습니다. 내 자신의 문제와 관련하여 여기서 질문을 다시 말하십시오.HDF5 파일에서 정보 삭제

큰 지오메트리에서 거대한 노드와 요소 파일을 가지고 있으며 필요한 정보를 모두 검색했습니다. 따라서 파이썬에서는 원본 파일을 유지하려고하지만 필요하지 않은 정보를 삭제하고 다른 소스에 대한 추가 정보를 채 웁니다. 예를 들어, 필요하지 않은 노드의 데이터 집합이 있습니다. 그러나 이웃 데이터 집합을 유지하고 외부 파일의 인덱스에 대한 정보를 포함해야합니다. 특정 데이터 세트를 삭제할 수있는 방법이 있습니까?

HDF5 파일에 "placekeeper"가 여전히있는 사실은 아무도 정보를 제거하는 데 어려움이 있다는 것을 알고 싶습니다. 너무 빈 공간에 대해 걱정하지 않아도됩니다. 단순히 정보를 제거하고 추가하여 완전히 새로운 파일을 만드는 것이 더 빠르면됩니다.

참고 : H5py의 'r +'를 사용하여 읽고 쓰고 있습니다.

답변

15

hdf5 파일에서 전체 노드 (그룹 또는 데이터 세트)를 제거해도 문제가 없습니다.
그러나 공간을 되찾고 싶다면 h5repack 도구를 실행해야합니다. hdf5 docs에서

:

5.5.2. 파일 및 공간 교정에서 데이터 집합을 삭제하면

HDF5는 현재 파일에서 데이터 집합을 제거하거나 삭제 된 개체가 차지하는 저장 공간을 확보하기 쉬운 메커니즘을 제공하지 않습니다.

데이터 세트를 제거하고 사용 된 공간을 다시 확보하려면H5Ldelete 함수와 h5repack 유틸리티 프로그램을 사용하면됩니다. H5Ldelete 함수를 사용하면 구조에서 데이터 집합에 대한 링크를 제거 할 수 있습니다. 모든 링크가 제거 된 후에 데이터 세트는 어플 리케이션에 액세스 할 수없고 파일에서 효과적으로 제거됩니다. 링크되지 않은 데이터 세트가 차지하는 공간을 복구하는 방법은 이며 파일의 모든 객체를 새 파일에 기록합니다. 연결 해제 된 개체는 응용 프로그램에서 액세스 할 수 없으므로 새 파일 에 포함되지 않습니다. 새로운 파일에 객체를 작성하는 것은 사용자 정의 프로그램이나 h5repack 유틸리티 프로그램을 사용하여 수행 할 수 있습니다.

PyTables의 ptrepack 도구를 살펴볼 수도 있습니다. PyTables는 h5py hdf5 파일을 읽을 수 있어야하며 ptrepack 도구는 h5repack과 비슷합니다.

데이터 세트에서 레코드를 제거하려면 보관하려는 레코드를 검색하고 새 데이터 세트를 만들고 이전 레코드를 제거해야합니다.
PyTables는 removing 개의 행을 지원하지만 권장하지는 않습니다.

+1

자세한 설명과 유용한 링크를 제공해 주셔서 감사합니다. 이것은 내가 필요한 것입니다. – Ason

+1

감사합니다. 이것은 여전히 ​​그렇습니다. 탐구/확인 프로그래밍 방식 [여기] (https://github.com/jackdotwa/python-concepts/blob/master/hdf5/reclaiming_space.ipynb). –

0

분석 프로세스가 끝나면 특정 데이터 세트가 제거된다는 것을 알고 있다면 왜 마스터 파일에 보관해야합니까? 분석이 완료된 후 폐기 될 수있는 별도의 HDF5 파일에 임시 데이터를 저장합니다.마스터 파일 내부의 임시 데이터 세트를 연결하는 것이 중요하다면 H5Lcreate_external()을 사용하여 마스터와 임시 파일 사이에 외부 링크를 만듭니다. 외부 링크는 사소한 공간을 소비합니다.