Самый быстрый способ чтения сложных структур данных с диска в Python - PullRequest
0 голосов
/ 07 января 2019

У меня есть набор данных в CSV, содержащий списки значений в виде строк в одном поле, которое выглядит примерно так:

Id,sequence
1,'1;0;2;6'
2,'0;1'
3,'1;0;9'

В реальном наборе данных, с которым я имею дело, длина последовательности сильно варьируется и может содержать от одного до нескольких тысяч наблюдений. Существует много столбцов, содержащих последовательности, которые хранятся в виде строк.

Я читаю эти строки CSV и разбора, чтобы стать списками, вложенными в Pandas DataFrame. Это займет некоторое время, но я в порядке.

Однако позже, когда я сохраню проанализированные результаты, чтобы засечь, время чтения этого файла рассылки будет очень большим.

Я сталкиваюсь со следующим:

  • Чтение необработанного CSV-файла с такой структурой ~ 600 МБ в Pandas занимает около 3 секунд.
  • Чтение тех же (необработанных, необработанных) данных из рассола занимает ~ 0,1 секунды.
  • Чтение обработанных данных с рассола занимает 8 секунд!

Я пытаюсь найти способ прочитать обработанные данные с диска как можно быстрее.

Уже пробовал:

  • Экспериментируйте с различными форматами хранения, но большинство из них не может хранить вложенные структуры. Единственным, что сработало, был msgpack, но это не сильно улучшило производительность.
  • Использование структур, отличных от Pandas DataFrame (например, кортеж кортежей), с аналогичной производительностью.

Я не очень привязан к точной структуре данных. Дело в том, что я хотел бы быстро прочитать проанализированные данные с диска непосредственно в Python.

1 Ответ

0 голосов
/ 07 января 2019

Это может быть дубликатом этого вопроса

HDF5 работает немного быстрее при обработке вложенных кадров данных панд. Я бы дал этому шанс.

Пример использования, заимствованный из здесь , показывает, как вы можете эффективно разделить его на части при выгрузке:

import glob, os
import pandas as pd

df = DataFrame(np.random.randn(1000,2),columns=list('AB'))
df.to_hdf('test.h5','df',mode='w',format='table',data_columns=True)
store = pd.HDFStore('test.h5')
nrows = store.get_storer('df').nrows
chunksize = 100
for i in xrange(nrows//chunksize + 1):
    chunk = store.select('df',
                         start=i*chunksize,
                         stop=(i+1)*chunksize) 
store.close()

Когда вы читаете это обратно, вы можете сделать это и такими кусками:

for df in pd.read_hdf('raw_sample_storage2.h5','raw_sample_all', start=0,stop=300000,chunksize = 3000):
    print df.info()
    print(df.head(5))
...