Предположим, мы используем pandas.HDFStore
для хранения df.И пусть он хранится в формате table
.Таким образом, мы можем запросить подкадры, сделать некоторые споры, добавить больше данных в df (предположим, что мы работаем с потоковыми данными) и т. Д.
Но как только мы закончили обработкуданные (в случае потоковой передачи - например, мы обработали все данные за прошедший год), мы можем захотеть, чтобы эти данные стали «твердыми», то есть больше не нужно было добавлять / добавлять запросы (мы уже сделали с этим).И в то же время мы можем захотеть прочитать полное df
из HDFStore
назад, например, чтобы визуализировать обработанные результаты.В этом случае формат fixed
является лучшим.Поскольку он занимает меньше места на диске, он намного быстрее читается целиком.
Так вот, есть ли способ on_disk изменить формат хранимого кадра данных с table
на fixed
(может быть, удалить все «индексы» или что-то вроде этого)?
Почему на диске?Из-за оперативной памяти конечно.Во время добавления наша df
может стать действительно большой , поэтому нашей оперативной памяти достаточно только для чтения df и составления некоторого простого графика или вычисления статистики, и мы не можем позволить себе даже читать df
из магазина в table
формат:
size_mult = 7
df = pd.DataFrame(np.random.rand(10**size_mult, 10),
columns = list('abcdefghik'))
print('df size is %d MiB' % (df.memory_usage().sum()//1024**2))
with pd.HDFStore('test.h5') as store:
%memit store.put('df', df, 't', data_columns=['a','b','c'])
%memit store.select('df')
store.remove('df')
del df
_ = gc.collect()
Занимает много лишней памяти:
df size is 762 MiB
peak memory: 2375.16 MiB, increment: 1335.83 MiB
peak memory: 4217.48 MiB, increment: 3088.03 MiB
Думаю, здесь стоит взять вторую и принять «забавную» записку - с помощью dfразмер 760 мегабайт требуется 4200 мегабайт (то есть примерно в 6 раз больше, чем начальный размер df), чтобы просто прочитать кадр данных из HDFStore
, если формат table
и 3указаны столбцы данных.
Но если каким-то образом удалось изменить формат на диске на fixed
, ситуация становится более приемлемой:
size_mult = 7
df = pd.DataFrame(np.random.rand(10**size_mult, 10),
columns = list('abcdefghik'))
print('df size is %d MiB' % (df.memory_usage().sum()//1024**2))
with pd.HDFStore('test.h5') as store:
%memit store.put('df', df, 'f')
%memit store.select('df')
store.remove('df')
del df
_ = gc.collect()
df size is 762 MiB
peak memory: 1001.88 MiB, increment: 76.30 MiB
peak memory: 1745.78 MiB, increment: 743.89 MiB