2016-04-03 5 views
1
import numpy 
import pandas as pd 
import math as m 
import os 
import datetime 
from time import gmtime, strftime 


final = "D:/Technical_Data/final.csv" 

group_col_indx = 0 
group_col = pd.read_csv(final, usecols=[group_col_indx]) 
keys = group_col.iloc[:,0].unique() 

for key in keys: 
    df_list = [] 
    print key 
    reader = pd.read_csv(final, chunksize=20000) 
    for chunk in reader: 
     good_rows = chunk[chunk.iloc[:,group_col_indx] == key] 
     df_list.append(good_rows) 
    df_key = pd.concat(df_list) 
    file_save = "D:/Technical_Data_by_Date/" + str(key) + ".csv" 
    df_key.to_csv(file_save, header=False,index=False) 

スタックオーバーフローとGoogleの助けを借りて、大きなファイルを1番目の列を使用して複数のファイルに分割するコードを思いついた。 私は8GBのRAMを持っている私のマシン上で実行しています。プログラムは非常に遅いです。どうすればスピードアップできますか?私は過去2日間の研究を行なったし、これは、私はこれが速くなるかどうかはわからない最初の列にファイルを分割するコードを高速化する方法

+0

出力ファイルはいくつありますか?すぐにそれらをすべて開いたままにしておくことは合理的でしょうか? – tdelaney

+0

@tdelaney出力ファイルの数は約600くらいです。将来は3000まで増えます。 – nnnnmmm

+0

はiteratorよりも良いアイデアですか? – nnnnmmm

答えて

2

私はあなたがあなたのデータを処理したいとは思われないので、私はちょうどそれを分割し、この場合には、それを使用することはありません愛のパンダを行いますが。あなただけのキー(日付)して、CSVファイルを分割したいのであれば、あなたは、単にそのためgawkを使用することができます:あなたの鍵は、第二のカラム$2(変化であると仮定すると

$2 - >$1あなたのキー列が入っている場合最初の列)...

prg.awk

{ 
    key = $2 
    print > "D:/Technical_Data_by_Date/"key".csv" 
} 

コマンド:

gawk -F"," -f prg.awk final.csv 

それは

あなたの場合、すべての手段によってずっと高速に動作のpython +パンダを使用したいと思うでしょう - 約つまりあなたはあなたの入力CSVファイルにものを読ん(現在あなたがそれを行うnumber of keys + 1回、作ります。 601回):

import pandas as pd 

fn = 'D:/Technical_Data/final.csv' 
sep=',' 
out_path = 'D:/Technical_Data_by_Date' 
chunk_size = 20000 
key_col_idx = 0 

reader = pd.read_csv(fn, sep=sep, chunksize=chunk_size) 

for chunk in reader: 
    # loop through keys 
    for key in chunk.iloc[:, key_col_idx].unique(): 
     # writing (appending: mode='a') data to CSV files (by key) 
     chunk[chunk.iloc[:, key_col_idx] == key] \ 
      .to_csv('{0}/{1}.csv'.format(out_path, key), 
        mode='a', header=None, index=False) 

PS代わりにそれは遅いAWK溶液と比較すること

PPSを上書きするのCSVファイルにデータを追加します.to_csv()メソッドを呼び出すときトリックmode='a'パラメータを使用することである

0

それを思い付いたスクリプトですが、一度開いた保つためにあまりにも多くの出力ファイルを持っているので、あなたがファイルを開くことができますグループで。これは、入力ファイルをスキャンする必要がある回数を減らします。ここでは、1行ずつ読み込みを行い、複数の巻き戻し - 読み書きサイクルを実行しています。 csvがシンプルであれば、速度を少し上げることができます。単純なsplitを最初のコンマで使用すると、かさばるcsvモジュールを使用する代わりに鍵を見つけることができます。

pandasゲームはそれだけの価値があるかどうかを教えて...その、少なくともデータポイント速くない場合。

import os 
import csv 

final = "D:/Technical_Data/final.csv" 
outdir = "D:/Technical_Data_by_Date" 
maxfiles = 128 

with open(final) as infile: 
    reader = csv.reader(infile, buffering=32*1024*1024) 

    # scan file for keys 
    keys = list(set(row[0] for row in reader)) 

    # scan and write 'maxfiles' at a time 
    for keyidx in range(0, len(keys), maxfiles): 
     keygrp = keys[keyidx:keyidx+maxfiles] 
     outcsvs = {} 
     outfps = [] 
     try: 
      # open next group of output files 
      for key in keygrp: 
       fp = open(os.path.join(outdir, "{}.csv".format(key)), 
        "w", newline='', buffering=1024*1024) 
       outcsvs[key] = csv.writer(fp) 
       outfps.append(fp)    
      # rewind input and extract rows 
      infile.seek(0) 
      for row in reader: 
       writer = outcsvs.get(row[0]) 
       if writer: 
        writer.writerow(row) 
     finally: 
      for fp in outfps: 
       fp.close() 
関連する問題