大規模なcsvファイルの読み込みを高速化するために、マルチプロセッシングモジュールからプールを使用しようとしました。このため、私はexample(py2kから)を採用しましたが、csv.dictreaderオブジェクトの長さがないようです。私はそれを繰り返すことができますか?まだチャンクする方法はありますか?Python 3.2でcsv(dict)リーダーオブジェクトをチャンクする方法は?
これらの質問は、関連するように見えたが、実際に私の質問に答えていませんでした: Number of lines in csv.DictReader、 How 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)