Pandas HDFStore меняет формат хранимых данных - PullRequest
1 голос
/ 14 июня 2019

Предположим, мы используем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...