Об этом уже есть хороший вопрос в SO, но лучший ответ Сейчас ему 5 лет, поэтому я думаю, что в 2018 году должны быть варианты получше.
В настоящее время я ищу конвейер разработки функций для большего, чем набор данных памяти (с использованием подходящих типов dtypes).
Исходный файл - это CSV, который не помещается в памяти. Вот мои потребности:
- Создавайте функции (в основном, используя групповые операции с несколькими столбцами).
- Объедините новую функцию с предыдущими данными (на диске, потому что они не помещаются в памяти)
- Используйте подмножество (или все) столбцы / индекс для некоторых приложений машинного обучения
- Повторите 1/2/3 (это итеративный процесс, такой как день 1: создание 4 функций, день 2: создание еще 4 ...)
Попытка с паркетом и dask:
Сначала я разделил большой CSV-файл на несколько маленьких паркетных файлов. При этом dask очень эффективен для вычисления новых функций, но затем мне нужно объединить их с исходным набором данных и atm, мы не можем добавлять новые столбцы в файлы parquet. Чтение CSV по частям, слияние и повторное сохранение в несколько паркетных файлов занимает слишком много времени, поскольку разработка функций в этом проекте является итеративным процессом.
Попытка HDF и dask:
Затем я обратился к HDF, потому что мы можем добавлять столбцы, а также использовать специальные запросы, и это все еще хранилище двоичных файлов. Я снова разделил большой файл csv на несколько HDF с тем же ключом = 'base' для базовых функций, чтобы использовать одновременную запись с DASK (не разрешено HDF).
data = data.repartition(npartitions=10) # otherwise it was saving 8Mo files using to_hdf
data.to_hdf('./hdf/data-*.hdf', key='base', format='table', data_columns=['day'], get=dask.threaded.get)
(Очередь приложения: указание data_columns для dask кажется бесполезным, поскольку в dask.read_hdf нет where?)
В отличие от того, что я ожидал, я не могу объединить новую функцию с несколькими небольшими файлами с таким кодом:
data = dd.read_hdf('./hdf/data-*.hdf', key='base')
data['day_pow2'] = data['day']**2
data['day_pow2'].to_hdf('./hdf/data-*.hdf', key='added', get=dask.threaded.get)
с dask.threaded я получаю, что python перестал работать после 2%. С dask.multiprocessing.get это занимает вечность и создает новые файлы
Какие инструменты (хранение и обработка) наиболее подходят для этого рабочего процесса?