h5py: maneira correta de dividir conjuntos de dados da matriz
Estou um pouco confuso aqui:
Até onde eu entendi, o h5py's.value
O método lê um conjunto de dados inteiro e o despeja em uma matriz, o que é lento e desanimado (e geralmente deve ser substituído por[()]
. A maneira correta é usar fatias numpy-esque.
No entanto, estou obtendo resultados irritantes (com o h5py 2.2.1):
import h5py
import numpy as np
>>> file = h5py.File("test.hdf5",'w')
# Just fill a test file with a numpy array test dataset
>>> file["test"] = np.arange(0,300000)
# This is TERRIBLY slow?!
>>> file["test"][range(0,300000)]
array([ 0, 1, 2, ..., 299997, 299998, 299999])
# This is fast
>>> file["test"].value[range(0,300000)]
array([ 0, 1, 2, ..., 299997, 299998, 299999])
# This is also fast
>>> file["test"].value[np.arange(0,300000)]
array([ 0, 1, 2, ..., 299997, 299998, 299999])
# This crashes
>>> file["test"][np.arange(0,300000)]
Eu acho que meu conjunto de dados é tão pequeno que.value
não prejudica o desempenho significativamente, mas como a primeira opção pode ser tão lenta? Qual é a versão preferida aqui?
Obrigado!
ATUALIZAR Parece que eu não estava suficientemente claro, desculpe. Eu sei isso.value
copia todo o conjunto de dados na memória enquanto o fatiamento recupera apenas a subparte apropriada. O que eu quero saber é por que cortar em arquivo éMais devagar do que copiar toda a matriz e depois fatiar na memória. Eu sempre pensei que o hdf5 / h5py fosse implementado especificamente, para que as subpartes de fatias fossem sempre as mais rápidas.