【问题标题】:Pandas read_csv is super slow on NFSPandas read_csv 在 NFS 上超级慢
【发布时间】:2016-07-26 19:47:22
【问题描述】:

我有一个非常简单的脚本,它使用pandas.parse_csv 方法来加载大型数据集。

import pandas as pd
import numpy as np

USE_COLUMNS = [0,1,2,11,13,14]

def parse_csv(filename):
    df = pd.read_csv(filename,
                     header=None,
                     compression='bz2',
                     delim_whitespace=True,
                     dtype={11:np.float32, 13:np.float32, 14:np.float32},
                     skip_blank_lines=True,
                     skiprows=4,
                     parse_dates=[[1,2]],
                     usecols=USE_COLUMNS,
                     error_bad_lines=False,
                     infer_datetime_format=True,
                     iterator=True,
                     chunksize=100000,
                     low_memory=False,
                     engine='c')
    return df

fname = 'test.log.bz2'
iter = parse_csv(fname)
df = pd.concat([chunk[chunk[14] > 60000] for chunk in iter])
print df

文件test.log.bz2 是1.1GB 压缩和5+GB 未压缩,它有15 列,只有其中一些被使用。在我的本地机器上,这个脚本需要大约 200 秒才能运行。但在生产机器上运行 53 分钟(x16 减速)!我该如何解决这个问题?

在我的本地机器上,我使用的是 SATA SSD,而在生产机器上,NFS 支持的文件系统是唯一的选择。

我使用的是熊猫版本 0.16.2。

我在本地机器上的 strace 下运行这个脚本,结果如​​下:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 57.09    0.038753           2     15618           mremap
 18.83    0.012780           0    109476           munmap
 14.81    0.010055           0    109669           mmap
  3.44    0.002337           0    259922           read
  2.10    0.001427           0      5549      4780 open
  1.45    0.000987           1       713           brk

strace 生产环境结果:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 92.41    0.491816          46     10766           mremap
  4.59    0.024412           7      3491      2814 open
  0.76    0.004065           0      9897           read
  0.75    0.003999          15       274       274 unlink
  0.50    0.002652           3       974       838 stat
  0.47    0.002498        1249         2           clone
  0.35    0.001865           0      4659           munmap
------ ----------- ----------- --------- --------- ----------------
100.00    0.532200                 37118      3997 total

【问题讨论】:

  • 好吧,把你的生产 NFS 放到 SSD 上,使用 10GiB 以太网,然后你可以比较速度;)现在认真 - 我会开始考虑 HDFS 和 Apache Spark 用于 5+GB 文件
  • 我可以在生产机器上在 10 秒内解压这个存档文件。
  • 将打包文件复制到运行pandas的机器上并在那里解压需要多长时间?我的意思是这两个操作,没有读取/解析 CSV...
  • 只需几秒钟。
  • 以及在 prod 上解析 (read_csv) 解压文件需要多长时间。复制和解包后的机器?

标签: python python-2.7 pandas nfs


【解决方案1】:

我建议您在将数据加载到 pandas 之前对其进行预过滤(使用标准工具:bzip2gawk):

bzip2 -dc /path/to/test.log.bz2 | gawk -F"," 'NR > 4 && $15 > 600000.0 {print}' > /path/to/test_filtered.log

这应该会更快,并且会消耗更少的内存

请注意$15 而不是chunk[14] - AWK 从 1 开始计算列

之后,您可以简单地将预过滤的未压缩 CSV 加载到 pandas 中

PS 你可能还想tune up你的 NFS

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 2015-11-24
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2023-02-01
    • 2015-03-28
    • 2023-02-06
    相关资源
    最近更新 更多