我正在编写一个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而导致的填充。