Можно ли загружать большие данные непосредственно в массив numpy int8 с помощью h5py?

У меня есть очень большой файл данных (массив 1000 на 1400000), который содержит целые числа 0, 1, 2 и 4. Загрузка этих больших данных в массив numpy с использованием h5py занимает очень много времени, потому что моя память (4 ГБ) не может вместить столько и программа использует пространство подкачки. Поскольку в данных всего 4 числа, я хочу использовать 8-битный целочисленный массив. В настоящее время я загружаю данные и после этого преобразовываю их в 8-битный массив int.

with h5py.File("largedata", 'r') as f:

    variables = f.items()
    # extract all data
    for name, data in variables:
        # If DataSet pull the associated Data
        if type(data) is h5py.Dataset:
            value = data.value
            if(name == 'foo'):
                # convert to 8 bit int
                nparray = np.array(value, dtype=np.int8)

Можно ли загрузить данные непосредственно в 8-битный массив целых чисел, чтобы сэкономить память при загрузке?


person takasoft    schedule 23.02.2017    source источник
comment
Попробуйте data.value.astype(np.int8)   -  person hpaulj    schedule 23.02.2017
comment
Или рассмотрите возможность загрузки фрагментов. Какой тип данных в файле?   -  person hpaulj    schedule 23.02.2017


Ответы (1)


Со страницы документации набора данных

 astype(dtype)

 Return a context manager allowing you to read data as a particular type. 
 Conversion is handled by HDF5 directly, on the fly:

>>> dset = f.create_dataset("bigint", (1000,), dtype='int64') 
>>> with dset.astype('int16'): 
      out = dset[:] 
>>> out.dtype 
       =dtype('int16')
person hpaulj    schedule 23.02.2017