Pandas to_csv()减慢了保存大型数据帧的速度

时间:2016-11-17 16:37:57

标签: python csv pandas dataframe

我猜这是一个简单的解决方法,但是我遇到了一个问题,即使用 to_csv()函数将pandas数据帧保存到csv文件需要将近一个小时。我正在使用带有pandas(0.19.1)的anaconda python 2.7.12。

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列),主要是数字(十进制)数据。

谢谢,

3 个答案:

答案 0 :(得分:4)

您正在阅读压缩文件并编写纯文本文件。 可能是IO瓶颈。

编写压缩文件可以加速写入10倍

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

此外,您可以尝试不同的块大小和压缩方法('bz2','xz')。

答案 1 :(得分:1)

由于'gzip'替代方法对我不起作用,因此添加了一点见识-尝试使用to_hdf方法。这大大减少了写入时间!  (对于100MB的文件,不到一秒钟的时间-CSV选项在30-55秒之间执行了此操作)

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

答案 2 :(得分:0)

您说的是“ [...]大部分为数字(十进制)数据。”。您是否有任何带有时间和/或日期的列?

当它只有数字/字符串值时,我在几秒钟内保存了8 GB的CSV格式,但是用两个Dates列保存500 MB的CSV需要20分钟。因此,我建议您在保存每个日期列之前将其转换为字符串。以下命令就足够了:

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

我希望这个答案对您有所帮助。

P.S .:我了解另存为.hdf文件可以解决此问题。但是,有时候,我们还是需要一个.csv文件。