Подтвердить что ты не робот

Pandas to_csv() медленное сохранение большого кадра данных

Я предполагаю, что это простое исправление, но я столкнулся с проблемой, когда занимает около часа, чтобы сохранить фреймворк pandas в файл csv с помощью to_csv() функция. Я использую anaconda python 2.7.12 с pandas (0.19.1).

import os
import glob
import pandas as pd

src_files = glob.glob(os.path.join('/my/path', "*.csv.gz"))

# 1 - Takes 2 min to read 20m records from 30 files
for file_ in sorted(src_files):
    stage = pd.DataFrame()
    iter_csv = pd.read_csv(file_
                     , sep=','
                     , index_col=False
                     , header=0
                     , low_memory=False
                     , iterator=True
                     , chunksize=100000
                     , compression='gzip'
                     , memory_map=True
                     , encoding='utf-8')

    df = pd.concat([chunk for chunk in iter_csv])
    stage = stage.append(df, ignore_index=True)

# 2 - Takes 55 min to write 20m records from one dataframe
stage.to_csv('output.csv'
             , sep='|'
             , header=True
             , index=False
             , chunksize=100000
             , encoding='utf-8')

del stage

Я подтвердил, что аппаратное обеспечение и память работают, но это довольно широкие таблицы (~ 100 столбцов) в основном числовые (десятичные) данные.

Спасибо,

4b9b3361

Ответ 1

Вы читаете сжатые файлы и записываете текстовый файл. Может быть узким местом ввода-вывода.

Запись сжатого файла может ускорить запись до 10x

    stage.to_csv('output.csv.gz'
         , sep='|'
         , header=True
         , index=False
         , chunksize=100000
         , compression='gzip'
         , encoding='utf-8')

Кроме того, вы можете экспериментировать с различными размерами блоков и методами сжатия ('bz2,' xz).

Ответ 2

Добавлю свое небольшое понимание, поскольку альтернатива 'gzip' не сработала для меня - попробуйте использовать метод to_hdf. Это значительно сократило время записи! (менее чем за секунду для файла размером 100 МБ - опция CSV изменяла это в течение 30-55 секунд)

stage.to_hdf(r'path/file.h5', key='stage', mode='w')

Ответ 3

Вы сказали "[...] в основном числовые (десятичные) данные.". У вас есть колонка со временем и/или датами?

Я сохранил 8 ГБ CSV в секундах, когда он имеет только числовые/строковые значения, но для сохранения 500 МБ CSV с двумя столбцами Dates требуется 20 минут. Поэтому я рекомендую преобразовать каждый столбец даты в строку перед ее сохранением. Следующей команды достаточно:

df['Column'] = df['Column'].astype(str) 

Я надеюсь, что этот ответ поможет вам.

П.С.: Я понимаю, что сохранение в виде файла .hdf решило проблему. Но иногда нам все равно нужен файл .csv.