Thứ Năm, 17 tháng 1, 2019

Câu hỏi Cách đọc và ghi tệp HDF5 bằng Python

Tôi đang cố gắng đọc dữ liệu từ tập tin hdf5 bằng Python. Tôi có thể đọc tệp hdf5 bằng h5py, nhưng tôi không thể tìm ra cách truy cập dữ liệu trong tệp.

Code

import h5py    
import numpy as np    
f1 = h5py.File(file_name,'r+')    
Điều này làm việc và tập tin được đọc. Nhưng làm thế nào tôi có thể truy cập dữ liệu bên trong đối tượng tập tin f1?

Các câu trả lời:


Đọc HDF5

import h5py
filename = 'file.hdf5'
f = h5py.File(filename, 'r')

# List all groups
print("Keys: %s" % f.keys())
a_group_key = list(f.keys())[0]

# Get the data
data = list(f[a_group_key])

Viết HDF5

#!/usr/bin/env python
import h5py

# Create random data
import numpy as np
data_matrix = np.random.uniform(-1, 1, size=(10, 3))

# Write data to HDF5
data_file = h5py.File('file.hdf5', 'w')
data_file.create_dataset('group_name', data=data_matrix)
data_file.close()
Xem tài liệu h5py để biết thêm thông tin.

Giải pháp thay thế

Đối với ứng dụng của bạn, những điều sau đây có thể quan trọng:
  • Hỗ trợ bởi các ngôn ngữ lập trình khác
  • Hiệu năng đọc / ghi
  • Nhỏ gọn (kích thước tệp)

(Nguồn: http://paginaswebpublicidad.com/questions/18578/cach-doc-tep-hdf5-bang-python)

=============================================================================

Câu hỏi Cách nhanh nhất để ghi tệp HDF5 bằng Python?

Với tệp CSV lớn (10s GB) của văn bản / số hỗn hợp, cách nhanh nhất để tạo tệp HDF5 có cùng nội dung là gì, trong khi vẫn giữ mức sử dụng bộ nhớ hợp lý?
Tôi muốn sử dụng h5py module nếu có thể.
Trong ví dụ đồ chơi dưới đây, tôi đã tìm thấy một cách cực kỳ chậm và cực kỳ nhanh chóng để ghi dữ liệu vào HDF5. Nó sẽ là thực hành tốt nhất để viết cho HDF5 trong khối 10.000 hàng hay như vậy? Hay là có cách nào tốt hơn để viết một lượng lớn dữ liệu vào một tập tin như vậy?
import h5py

n = 10000000
f = h5py.File('foo.h5','w')
dset = f.create_dataset('int',(n,),'i')

# this is terribly slow
for i in xrange(n):
  dset[i] = i

# instantaneous
dset[...] = 42

Các câu trả lời:


Tôi sẽ tránh chunking dữ liệu và sẽ lưu trữ dữ liệu như là một loạt các bộ dữ liệu mảng đơn (dọc theo dòng của những gì Benjamin đang đề xuất). Tôi vừa tải xong đầu ra của một ứng dụng doanh nghiệp mà tôi đã làm việc trên HDF5, và có thể đóng gói khoảng 4,5 tỷ kiểu dữ liệu phức hợp như 450.000 tập dữ liệu, mỗi bộ chứa 10.000 mảng dữ liệu. Viết và đọc bây giờ có vẻ khá tức thời, nhưng đã rất chậm khi tôi cố gắng chunk dữ liệu.
Cập nhật:
Đây là một vài đoạn trích được lấy từ mã thực tế của tôi (tôi đang viết mã bằng C so với Python, nhưng bạn nên lấy ý tưởng về những gì tôi đang làm) và sửa đổi để làm rõ. Tôi chỉ viết các số nguyên không dấu dài trong mảng (10.000 giá trị cho mỗi mảng) và đọc chúng lại khi tôi cần một giá trị thực
Đây là mã nhà văn điển hình của tôi. Trong trường hợp này, tôi chỉ đơn giản là viết chuỗi số nguyên không dấu dài vào một chuỗi các mảng và tải mỗi chuỗi mảng vào hdf5 khi chúng được tạo ra.
//Our dummy data: a rolling count of long unsigned integers
long unsigned int k = 0UL;
//We'll use this to store our dummy data, 10,000 at a time
long unsigned int kValues[NUMPERDATASET];
//Create the SS adata files.
hid_t ssdb = H5Fcreate(SSHDF, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
//NUMPERDATASET = 10,000, so we get a 1 x 10,000 array
hsize_t dsDim[1] = {NUMPERDATASET};
//Create the data space.
hid_t dSpace = H5Screate_simple(1, dsDim, NULL);
//NUMDATASETS = MAXSSVALUE / NUMPERDATASET, where MAXSSVALUE = 4,500,000,000
for (unsigned long int i = 0UL; i < NUMDATASETS; i++){
    for (unsigned long int j = 0UL; j < NUMPERDATASET; j++){
        kValues[j] = k;
        k += 1UL;
    }
    //Create the data set.
    dssSet = H5Dcreate2(ssdb, g_strdup_printf("%lu", i), H5T_NATIVE_ULONG, dSpace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
    //Write data to the data set.
    H5Dwrite(dssSet, H5T_NATIVE_ULONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, kValues);
    //Close the data set.
    H5Dclose(dssSet);
}
//Release the data space
H5Sclose(dSpace);
//Close the data files.
H5Fclose(ssdb);
Đây là phiên bản sửa đổi của mã trình đọc của tôi. Có nhiều cách thanh lịch hơn để thực hiện điều này (tức là, tôi có thể sử dụng hyperplanes để lấy giá trị), nhưng đây là giải pháp sạch nhất đối với quy trình phát triển Agile / BDD khá kỷ luật của tôi.
unsigned long int getValueByIndex(unsigned long int nnValue){
    //NUMPERDATASET = 10,000
    unsigned long int ssValue[NUMPERDATASET];
    //MAXSSVALUE = 4,500,000,000; i takes the smaller value of MAXSSVALUE or nnValue
    //to avoid index out of range error 
    unsigned long int i = MIN(MAXSSVALUE-1,nnValue);
    //Open the data file in read-write mode.
    hid_t db = H5Fopen(_indexFilePath, H5F_ACC_RDONLY, H5P_DEFAULT);
    //Create the data set. In this case, each dataset consists of a array of 10,000
    //unsigned long int and is named according to its integer division value of i divided
    //by the number per data set.
    hid_t dSet = H5Dopen(db, g_strdup_printf("%lu", i / NUMPERDATASET), H5P_DEFAULT);
    //Read the data set array.
    H5Dread(dSet, H5T_NATIVE_ULONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, ssValue);
    //Close the data set.
    H5Dclose(dSet);
    //Close the data file.
    H5Fclose(db);
    //Return the indexed value by using the modulus of i divided by the number per dataset
    return ssValue[i % NUMPERDATASET];
}
Việc lấy đi chính là vòng lặp bên trong trong mã viết và phân chia số nguyên và các phép toán mod để lấy chỉ mục của mảng tập dữ liệu và chỉ mục của giá trị mong muốn trong mảng đó. Hãy cho tôi biết nếu điều này là rõ ràng, đủ để bạn có thể đặt cùng một cái gì đó tương tự hoặc tốt hơn trong h5py. Trong C, điều này là chết đơn giản và mang lại cho tôi tốt hơn đáng kể đọc / ghi lần so với một giải pháp dữ liệu chunked. Thêm vào đó, vì tôi không thể sử dụng nén với bộ dữ liệu hợp chất, nên sự lộn xộn rõ ràng là một điểm tranh luận, vì vậy tất cả các hợp chất của tôi được lưu trữ theo cùng một cách.
(Nguồn: http://paginaswebpublicidad.com/questions/23085/cach-nhanh-nhat-de-ghi-tep-hdf5-bang-python)

Không có nhận xét nào: