Câu trả lời:
Có lẽ một cách tốt để diễn giải câu hỏi là, những lợi thế so với các định dạng thay thế là gì?
Các lựa chọn thay thế chính là, tôi nghĩ: cơ sở dữ liệu, tệp văn bản hoặc định dạng nhị phân / đóng gói khác.
Các tùy chọn cơ sở dữ liệu cần xem xét có thể là một cửa hàng cột hoặc NoQuery hoặc cho các bộ dữ liệu nhỏ độc lập SQLite. Ưu điểm chính của cơ sở dữ liệu là khả năng làm việc với dữ liệu lớn hơn nhiều so với bộ nhớ, có quyền truy cập ngẫu nhiên hoặc được lập chỉ mục và nhanh chóng thêm / nối / sửa đổi dữ liệu. Ưu điểm chính * dis * là nó chậm hơn nhiều so với HDF, đối với các vấn đề trong đó toàn bộ dữ liệu cần phải được đọc và xử lý. Một nhược điểm khác là, ngoại trừ các cơ sở dữ liệu kiểu nhúng như SQLite, cơ sở dữ liệu là một hệ thống (yêu cầu quản trị, thiết lập, bảo trì, v.v.) chứ không phải là một kho lưu trữ dữ liệu độc lập đơn giản.
Các tùy chọn định dạng tệp văn bản là XML / JSON / CSV. Chúng là đa nền tảng / ngôn ngữ / bộ công cụ và là một định dạng lưu trữ tốt do khả năng tự mô tả (hoặc rõ ràng :). Nếu không nén, chúng rất lớn (10 x 100 lần HDF), nhưng nếu được nén, chúng có thể khá hiệu quả về không gian (XML được nén tương đương với HDF). Nhược điểm chính ở đây là tốc độ một lần nữa: phân tích văn bản nhiều, chậm hơn nhiều so với HDF.
Các định dạng nhị phân khác (tệp npy / npz, tệp blz blaze, bộ đệm giao thức, Avro, ...) có các thuộc tính rất giống với HDF, ngoại trừ chúng ít được hỗ trợ rộng rãi (có thể chỉ giới hạn ở một nền tảng: numpy) và có thể có những hạn chế cụ thể khác. Họ thường không cung cấp một lợi thế hấp dẫn.
HDF là một bổ sung tốt cho cơ sở dữ liệu, có thể có ý nghĩa khi chạy một truy vấn để tạo ra một bộ dữ liệu có kích thước bộ nhớ và sau đó lưu nó vào HDF nếu cùng một dữ liệu sẽ được sử dụng nhiều lần. Nếu bạn có một tập dữ liệu đã được sửa và thường được xử lý toàn bộ, lưu trữ nó dưới dạng tập hợp các tệp HDF có kích thước phù hợp là một lựa chọn không tồi. Nếu bạn có một bộ dữ liệu được cập nhật thường xuyên, việc sắp xếp một số trong số đó dưới dạng tệp HDF định kỳ vẫn có thể hữu ích.
Tóm lại, HDF là một định dạng tốt cho dữ liệu thường được đọc (hoặc viết) nói chung; đó là định dạng trao đổi lingua franca hoặc phổ biến / ưa thích cho nhiều ứng dụng do hỗ trợ và khả năng tương thích rộng rãi, là định dạng lưu trữ và rất nhanh.
PS Để cung cấp cho bối cảnh thực tế này, kinh nghiệm gần đây nhất của tôi khi so sánh HDF với các lựa chọn thay thế, một bộ dữ liệu nhỏ (ít hơn nhiều so với bộ nhớ) đã mất 2 giây để đọc dưới dạng HDF (và hầu hết trong số này có lẽ là chi phí từ Pandas); ~ 1 phút để đọc từ JSON; và 1 giờ để ghi vào cơ sở dữ liệu. Chắc chắn cơ sở dữ liệu ghi có thể được tăng tốc, nhưng tốt hơn là bạn nên có một DBA tốt! Đây là cách nó hoạt động ra khỏi hộp.
Một lợi ích là hỗ trợ rộng rãi - C, Java, Perl, Python và R đều có các ràng buộc HDF5.
Một lợi ích khác là tốc độ. Tôi chưa bao giờ thấy nó được điểm chuẩn, nhưng HDF được cho là nhanh hơn cơ sở dữ liệu SQL.
Tôi hiểu rằng nó rất tốt khi được sử dụng với cả bộ dữ liệu khoa học lớn và dữ liệu chuỗi thời gian - giám sát mạng, theo dõi sử dụng, v.v.
Tôi không tin rằng có giới hạn kích thước cho các tệp HDF (mặc dù giới hạn hệ điều hành vẫn sẽ được áp dụng.
Để thêm, hãy xem ASDF cụ thể là giấy ASDF của họ : Một định dạng dữ liệu mới cho Thiên văn học ; ASDF cố gắng cải thiện HDF5 và bài viết mô tả một số nhược điểm của định dạng HDF5.