温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - Load group from hdf5
hdf5 python python-3.x

python - hdf5的负载组

发布于 2020-03-31 23:30:43

我有一个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并为amplitudehdfile的结构如下:

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_Ximpact_Y等等,因为它们代表数据到特定的XY位置。

我需要从每对或仅一对(时间,幅度)对(可配置)创建图。我还需要将幅度与“黄金”数组进行比较,以查看差异并计算其他内容。为了执行计算,我将读取所有数据集,执行计算并保存结果。

对于每个测试用例,我有超过200k .csv文件,总计超过5M。在这种情况下,使用从磁盘读取5M会花费很多时间。对于200k文件,通过将所有.csv导出到唯一的JSON文件,执行大约需要40s,而使用.csv需要大约4min。加载单个JSON文件时,由于内存问题,我无法再使用唯一的json。这就是为什么我选择hdf5作为替代。

编辑2:

我如何读取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
被浏览
13
titusjan 2020-01-31 19:43

不,没有一个函数可以一次读取多个组或数据集。您必须通过读取一组或数据集的较低级别的函数自己进行设置。

您能给我们进一步的介绍吗?它是什么样的数据,您想如何处理它?(您要进行统计吗?要作图吗?等等?)您最终想要实现什么?这可以帮助我们避免避免经典的XY问题

在您先前的问题中,您说过将许多小型CSV文件转换为一个大型HDF文件。你能告诉我们为什么吗?有许多CSV小文件怎么办?

以我的经验,具有大量组和数据集的HDF文件非常慢,就像您现在正在体验的那样。拥有相对较少但较大的数据集是否更好?您是否有可能以某种方式将多个数据集合并为一个?如果不是这样,HDF可能不是解决您问题的最佳解决方案。

最新帖子

最新文章