当数据太大而无法完全读取时,如何部分读取HDF5格式文件中的数据

时间:2017-12-26 12:27:22

标签: python hdf5 h5py

我从事分析HDF5格式数据用于科研目的。我正在使用Python的h5py库。

现在,我想读的HDF文件太大了。它的文件大小约为20GB,其数据的主要部分是400000 * 10000浮点矩阵。我试图读取一次数据,但由于内存不足,我的开发环境Spyder因强制而终止。那么有什么方法可以部分阅读它并避免这个问题吗?

2 个答案:

答案 0 :(得分:1)

pd.read_hdfcolumns参数一起使用。请参见下面的示例:

import numpy as np
import pandas as pd
from contexttimer import Timer


def create_sample_df():
    with Timer() as t:
        df = pd.DataFrame(np.random.rand(100000, 5000))
        df.to_hdf('file.h5', 'df', format='table')
    print('create_sample_df: %.2fs' % t.elapsed)


def read_full_df():
    """ data is too large to read fully """
    with Timer() as t:
        df = pd.read_hdf('file.h5')
    print('read_full_df: %.2fs' % t.elapsed)


def read_df_with_start_stop():
    """ to quick look all columns """
    with Timer() as t:
        df = pd.read_hdf('file.h5', start=0, stop=5)
    print('read_df_with_start_stop: %.2fs' % t.elapsed)


def read_df_with_columns():
    """ to read dataframe (hdf5) with necessary columns """
    with Timer() as t:
        df = pd.read_hdf('file.h5', columns=list(range(4)))
    print('read_df_with_columns: %.2fs' % t.elapsed)


if __name__ == '__main__':
    create_sample_df()
    read_full_df()
    read_df_with_start_stop()
    read_df_with_columns()

    # outputs:
    # create_sample_df: 51.25s
    # read_full_df: 5.21s
    # read_df_with_start_stop: 0.03s
    # read_df_with_columns: 4.44s

read_df_with_columns仅降低空间成本,但不一定提高速度性能。并假设HDF5以table格式保存(否则无法应用columns参数)。

答案 1 :(得分:0)

您可以像humpy数组一样切割h5py数据集,这样就可以处理多个子集而不是整个数据集(例如4 100000 * 10000个子集)。