2016-04-06 10 views
3

大きなデータセットをロードするのに、pandas.parse_csvメソッドを使用する非常に簡単なスクリプトがあります。Pandas read_csvはNFSで超スローです

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.1ギガバイト圧縮されている5 + GBは圧縮されていない、それは15列のみそれらのいくつかが使用されています。私のローカルマシンでは、このスクリプトは約200秒間実行する必要があります。しかし、生産マシンでは53分(x16の減速)を実行します!これをどうすれば解決できますか?

私のローカルマシンでは、SATA SSDを使用しています。本番マシンでは、NFSでバックアップされたファイルシステムが唯一のオプションです。

私はパンダバージョン0.16.2を使用しています。本番環境での

% 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 
+0

でも、SSDにプロダクションNFSを置き、10GiBイーサネットを使用して速度を比較することができます;)今真剣に - 私はHD FSとApache Sparkの5GBファイル – MaxU

+0

プロダクションマシンでこのアーカイブファイルを10秒で解凍できます。 – Lazin

+0

pandasが実行されているマシンにパックされたファイルをコピーしてそこに解凍するのにどれくらい時間がかかりますか? CSVを読み込み/解析せずに、これらの2つの操作だけを意味します。 – MaxU

答えて

0

私はあなたのデータをフィルタ事前にあなたを示唆している(

私はstraceの下に私のローカルマシン上でこのスクリプトを実行し、これが結果です標準ツールを使用して: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は、あなたは、単にパンダ

にプレフィルタ圧縮されていないCSVを読み込むことができ、その後1

から始まる列をカウント

PSあなたのNFSをtune up NFS

関連する問題