簡體   English   中英

在NFS上,Pandas read_csv超級慢

[英]Pandas read_csv is super slow on NFS

我有一個非常簡單的腳本,它使用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支持的文件系統是唯一的選擇。

我正在使用pandas版本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

我建議你在將數據加載到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你可能也想調整你的NFS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM