Как частично прочитать данные в файле формата HDF5, когда данные слишком велики для полного чтения

Я занимаюсь анализом данных формата HDF5 для научных исследований. Я использую библиотеку Python h5py.

Теперь файл HDF, который я хочу прочитать, очень велик. Размер его файла составляет около 20 ГБ, а основная часть данных - это матрица с плавающей запятой 400000 * 10000. Я попытался прочитать данные один раз, но моя среда разработки Spyder была принудительно закрыта из-за нехватки памяти. Тогда есть ли способ прочитать его частично и избежать этой проблемы?


person 171227register    schedule 26.12.2017    source источник


Ответы (2)


Используйте pd.read_hdf с аргументом columns. См. Пример ниже:

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 аргумент не может быть применен).

person Anonymous    schedule 26.07.2018

Вы можете нарезать наборы данных h5py, такие как массивы numpy, чтобы вы могли работать с несколькими подмножествами, а не со всем набором данных (например, 4 100000 * 10000 подмножеств).

person James Tocknell    schedule 27.12.2017