2011-09-11 10 views
0

大規模なcsvファイルの読み込みを高速化するために、マルチプロセッシングモジュールからプールを使用しようとしました。このため、私はexample(py2kから)を採用しましたが、csv.dictreaderオブジェクトの長さがないようです。私はそれを繰り返すことができますか?まだチャンクする方法はありますか?Python 3.2でcsv(dict)リーダーオブジェクトをチャンクする方法は?

これらの質問は、関連するように見えたが、実際に私の質問に答えていませんでした: Number of lines in csv.DictReaderHow to chunk a list in Python 3?

私のコードは、この実行しようとしました:csv.DictReader documentation(と、それはサブクラスcsv.readerクラスから

source = open('/scratch/data.txt','r') 
def csv2nodes(r): 
    strptime = time.strptime 
    mktime = time.mktime 
    l = [] 
    ppl = set() 
    for row in r: 
     cell = int(row['cell']) 
     id = int(row['seq_ei']) 
     st = mktime(strptime(row['dat_deb_occupation'],'%d/%m/%Y')) 
     ed = mktime(strptime(row['dat_fin_occupation'],'%d/%m/%Y')) 
     # collect list 
     l.append([(id,cell,{1:st,2: ed})]) 
     # collect separate sets 
     ppl.add(id) 
    return (l,ppl) 


def csv2graph(source): 
    r = csv.DictReader(source,delimiter=',') 
    MG=nx.MultiGraph() 
    l = [] 
    ppl = set() 
    # Remember that I use integers for edge attributes, to save space! Dic above. 
    # start: 1 
    # end: 2 
    p = Pool(processes=4) 
    node_divisor = len(p._pool)*4 
    node_chunks = list(chunks(r,int(len(r)/int(node_divisor)))) 
    num_chunks = len(node_chunks) 
    pedgelists = p.map(csv2nodes, 
         zip(node_chunks)) 
    ll = [] 
    for l in pedgelists: 
     ll.append(l[0]) 
     ppl.update(l[1]) 
    MG.add_edges_from(ll) 
    return (MG,ppl) 

答えて

1

を)、クラスはイテレータを返します。 len()を呼び出すと、コードにTypeErrorがスローされているはずです。

データをチャンクすることはできますが、データをすべてメモリに読み込む必要があります。メモリが気になる場合は、csv.DictReaderからcsv.readerに切り替えて、辞書のオーバーヘッドをスキップしてcsv.DictReaderを作成してください。 csv2nodes()で可読性を改善するには、各フィールドのインデックスに対応するために定数を割り当てることができます。

CELL = 0 
SEQ_EI = 1 
DAT_DEB_OCCUPATION = 4 
DAT_FIN_OCCUPATION = 5 

それは組み込み関数名ですので、私はまた、idとは異なる変数を使用することをお勧めします。