[英]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之前預先過濾你的數據(使用標准工具: bzip2
和gawk
):
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.