Размер кадра увеличивается после первого сохранения в формате .h5 - PullRequest
0 голосов
/ 21 марта 2020

A pandas Размер файла данных значительно увеличивается после его сохранения как .h5 в первый раз. Если я сохраню загруженный фрейм данных, размер файла снова не увеличится. Это заставляет меня подозревать, что какие-то метаданные сохраняются в первый раз. В чем причина этой складки?

Есть ли простой способ избежать этого?

Я могу сжать файл, но я делаю сравнения без сжатия. Будет ли проблема масштабироваться по-другому при сжатии?

Пример кода ниже. Размер файла увеличивается с 15.3 MB до 22.9 MB

import numpy as np
import pandas as pd
x = np.random.normal (0,1, 1000000)
y = x*2
dataset = pd.DataFrame({'Column1': x, 'Column2': y})
print (dataset.info(memory_usage='deep'))
dataset.to_hdf('data.h5', key='df', mode='w')
dataset2 = pd.read_hdf("data.h5")
print (dataset2.info(memory_usage='deep'))
dataset2.to_hdf('data2.h5', key='df', mode='w')
dataset3 = pd.read_hdf("data2.h5")
print (dataset3.info(memory_usage='deep'))

Вывод:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000000 entries, 0 to 999999
Data columns (total 2 columns):
Column1    1000000 non-null float64
Column2    1000000 non-null float64
dtypes: float64(2)
memory usage: 15.3 MB
None
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000000 entries, 0 to 999999
Data columns (total 2 columns):
Column1    1000000 non-null float64
Column2    1000000 non-null float64
dtypes: float64(2)
memory usage: 22.9 MB
None
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000000 entries, 0 to 999999
Data columns (total 2 columns):
Column1    1000000 non-null float64
Column2    1000000 non-null float64
dtypes: float64(2)
memory usage: 22.9 MB
None

Это происходит потому, что RangeIndex преобразуется в Int64Index при сохранении. Есть ли способ оптимизировать это? Похоже, что нет никакого способа отбросить индекс:

https://github.com/pandas-dev/pandas/issues/8319

1 Ответ

0 голосов
/ 21 марта 2020

Лучшее решение, которое я нашел до сих пор, это сохранить как рассол:

dataset.to_pickle("datapkl.pkl")

Менее удобный вариант - преобразовать в numpy и сохранить с помощью h5py, но затем загрузить и преобразовать обратно в pandas занимает много времени

a = dataset.to_numpy()
h5f = h5py.File('datah5.h5', 'w')
h5f.create_dataset('dataset_1', data=a)
...