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 столбцов) в основном числовые (десятичные) данные.
Спасибо,
Ответы
Ответ 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
.