我有一个hdf5文件,其中包含组内的数据集。例:
group1/dataset1
group1/dataset2
group1/datasetX
group2/dataset1
group2/dataset2
group2/datasetX
我能够独立读取每个数据集。这就是我从.hdf5文件读取数据集的方式:
def hdf5_load_dataset(hdf5_filename, dsetname):
with h5py.File(hdf5_filename, 'r') as f:
dset = f[dsetname]
return dset[...]
# pseudo-code of how I call the hdf5_load_dataset() function
group = {'group1':'dataset1', 'group1':'dataset2' ...}
for group in groups:
for dataset in groups[group]:
dset_value = hdf5_load_dataset_value(path_hdf5_file, f'{group}/{dataset}')
# do stuff
我想知道是否有可能将group1的所有数据集,然后group2的所有数据集作为字典或类似文件加载到单个文件中。我的脚本花费了相当多的时间(4分钟)来读取约200k数据集。有2k个群组和100个数据集。因此,如果我立即将一个组加载到内存中,它将不会使它过载,并且会提高速度。
这是我要查找的伪代码:
for group in groups:
dset_group_as_dict = hdf5_load_group(path_hdf5_file, f'{group}')
for dataset in dset_group_as_dict;
#do stuff
在每个.csv文件中:
time, amplitude
1.000e-08, -1.432e-07
1.001e-08, 7.992e-07
1.003e-08, -1.838e-05
1.003e-08, 2.521e-05
对于每个文件夹中的每个.csv文件我对数据集time
并为amplitude
。hdfile的结构如下:
XY_1/impact_X/time
XY_1/impact_Y/amplitude
哪里
time = np.array([1.000e-08, 1.001e-08, 1.003e-08, ...]) # 500 items
amplitude = np.array([-1.432e-07, 7.992e-07, -1.838e-05, ...]) # 500 items
XY_1
在太空中的位置。
impact_X
表示X
在位置XY_1上受到了影响,因此X
振幅发生了变化。
所以,XY_1
必须在不同的基团的XY_2
,以及impact_X
,impact_Y
等等,因为它们代表数据到特定的XY位置。
我需要从每对或仅一对(时间,幅度)对(可配置)创建图。我还需要将幅度与“黄金”数组进行比较,以查看差异并计算其他内容。为了执行计算,我将读取所有数据集,执行计算并保存结果。
对于每个测试用例,我有超过200k .csv文件,总计超过5M。在这种情况下,使用从磁盘读取5M会花费很多时间。对于200k文件,通过将所有.csv导出到唯一的JSON文件,执行大约需要40s,而使用.csv需要大约4min。加载单个JSON文件时,由于内存问题,我无法再使用唯一的json。这就是为什么我选择hdf5作为替代。
我如何读取csv文件:
def read_csv_return_list_of_rows(csv_file, _delimiter):
csv_file_list = list()
with open(csv_file, 'r') as f_read:
csv_reader = csv.reader(f_read, delimiter = _delimiter)
for row in csv_reader:
csv_file_list.append(row)
return csv_file_list
谢谢,请看一下更新后的问题。
@Raphael我不明白为什么读取JSON文件比单独的CSV文件要快。如果我正确理解,JSON文件将与所有CSV文件组合的大小一样大(即500万个数据元素)。您使用
numpy.loadtxt()
还是自己创建了功能?也许是因为我正在读取200k(针对每个测试用例).csv而不是单个json文件?我不确定。我使用读取csv并返回其值列表的脚本更新了问题。
我想我将继续使用.csv文件,因为在这种情况下hdfile较慢,并且比csv文件使用更多的空间。谢谢你的澄清。