2010-08-23 38 views
13

Tôi cần lưu trữ một mảng 512^3 trên đĩa theo một cách nào đó và hiện tôi đang sử dụng HDF5. Kể từ khi mảng là thưa thớt rất nhiều không gian đĩa bị lãng phí.Hỗ trợ mảng thưa thớt trong HDF5

HDF5 có hỗ trợ cho mảng thưa thớt không?

+0

[Câu trả lời này] [1] cung cấp giải pháp (chỉ Python). [1]: http://stackoverflow.com/a/22589030/2858145 –

Trả lời

2

bộ dữ liệu chunked (H5D_CHUNKED) cho phép lưu trữ thưa thớt nhưng tùy thuộc vào dữ liệu của bạn, chi phí có thể quan trọng.

Lấy một mảng điển hình và thử cả hai thưa thớt và không thưa thớt và sau đó so sánh kích thước tệp, sau đó bạn sẽ thấy nếu nó thực sự có giá trị.

+1

có, [this] (http://mail.hdfgroup.org/pipermail/hdf-forum_hdfgroup.org/2010-March/002704.html) bài giải thích cách thực hiện (hoặc có lẽ cách _not_ để làm điều đó) cảm ơn – andreabedini

1

HDF5 cung cấp lưu trữ được lập chỉ mục: http://www.hdfgroup.org/HDF5/doc/TechNotes/RawDStorage.html

+0

hi, Ím không thực sự quen thuộc với cách thức hoạt động của hdf5 trong nội bộ, làm cách nào để lưu trữ dữ liệu thô trong tệp hdf5? điều đó có nghĩa là tôi có thể bỏ qua bảng dữ liệu và viết các cấu trúc của riêng tôi? – andreabedini

12

Một giải pháp khác là tạo tập dữ liệu với compression option. Ví dụ: bằng Python sử dụng h5py:

import h5py 
f = h5py.File('my.h5', 'w') 
d = f.create_dataset('a', dtype='f', shape=(512, 512, 512), fillvalue=-999., 
        compression='gzip', compression_opts=9) 
d[3, 4, 5] = 6 
f.close() 

Kết quả là 4,5 KB. Nếu không nén, tập tin này sẽ có dung lượng khoảng 512 MB. Đó là mức nén 99.999%, bởi vì hầu hết dữ liệu là -999. (hoặc bất kỳ số nào là fillvalue bạn muốn).


Tương đương có thể đạt được bằng cách sử dụng API C++ HDF5 bằng cách thiết lập H5::DSetCreatPropList::setDeflate-9, với example shown in h5group.cpp.

+0

Mặc dù phân tích thực sự được thực hiện trong python, tệp hdf5 được tạo trong C++ nên h5py không phải là một tùy chọn. Có phải dạng nén tương tự được hỗ trợ bởi hdf5 không? Tôi biết pytables và h5py hỗ trợ các giao thức nén bổ sung. – andreabedini

+1

@andreabedini Tôi đã cập nhật câu trả lời với một liên kết đến một ví dụ C++ thực hiện cùng một kỹ thuật. Tôi tin rằng tập dữ liệu phải được chunked để cho phép nén. –

+0

Từ liên kết [HDF5] (http://docs.h5py.org/en/latest/high/dataset.html#chunked-storage) ở đầu câu trả lời: "Bộ nhớ đã lưu trữ có thể thay đổi kích thước bộ dữ liệu và vì dữ liệu được lưu trữ trong các khối có kích thước cố định, để sử dụng các bộ lọc nén. " Vì vậy, yep, chunking cần thiết cho nén. – hBy2Py

Các vấn đề liên quan