hdf5:Chunking将数据量增加到100%

时间:2017-06-12 14:51:51

标签: python hdf5 h5py chunking

我正在编写一个python脚本,以便连接许多小块和非块的.h5文件(每个约7MB)。所有文件的总磁盘空间为几GB。

每个文件都有两个数据集(uint8& float32类型),其形状(行,11,13,18)和& (行,6)。每个文件的行数略有不同(〜数千)。为了连接文件,我必须创建一个分块输出数据集(maxshape)。

现在,我注意到生成的输出文件比单个文件消耗更多的磁盘空间,例如: 7MB + 7MB = 22MB。

为了简化问题,还可以使用n = 1个文件进行连接,即将文件从非分块文件转换为分块.h5文件。
如果我手动强制小chunksize = 2,结果是7MB(unchunked) - > 7MB(分块) 但是,如果我将chunksize增加到一千以上,则所需的磁盘空间几乎翻倍:7MB(unchunked) - > 14MB(分块)。

现在我真的很想知道,为什么chunked和non chunked .h5文件之间的区别如此之大?

以下是chunksize = 2和chunksize = 2500文件的h5stat输出:
https://pastebin.com/Gg3LGQkk(2),https://pastebin.com/jUbfemp0(2500)。
看起来不是元数据,但原始数据是问题。

对于分块的.h5文件,增加的磁盘大小是否正常?如果是的话,用块存储我的数据是否有意义?后来,我正在逐行读取大型连接的.h5文件,所以我想知道在I / O中,非分块的.h5文件(磁盘大小较小)是否会慢得多。

带有h5py实现的代码段:

import h5py
#remove file_2 for the simplest non-chunked -> chunked conversion
file_list = [file_1.h5, file_2.h5] # not chunked, e.g. 2866 and 2825 rows
file_output = h5py.File('test.h5', 'w')

cum_rows_list = [0, 2866, 5691] # cumulative number of rows for the input

for n, input_file_name in enumerate(file_list):

    print 'Processing file ' + file_list[n]
    input_file = h5py.File(input_file_name, 'r')

    for folder_name in input_file:

        folder_data = input_file[folder_name] 
        if n == 0:
            # first file; create the dummy dataset with no max shape
            maxshape = (None,) + folder_data.shape[1:]

            # create chunked output dataset
            output_dataset = file_output.create_dataset(
            folder_name, data=folder_data, maxshape=maxshape, 
            chunks=(2500,) + folder_data.shape[1:])
            output_dataset.resize(cum_rows_list[-1], axis=0)

        else:
            # not important for only one file
            ...

    file_output.flush()

file_output.close()

更新 正如yar在评论中指出的那样,文件大小的差异是基于由于指定的chunksize而导致的填充。

0 个答案:

没有答案