【问题标题】:how to chunk a csv (dict)reader object in python 3.2?如何在 python 3.2 中对 csv (dict)reader 对象进行分块?
【发布时间】:2011-09-11 19:26:16
【问题描述】:

我尝试使用多处理模块中的 Pool 来加快读取大型 csv 文件的速度。为此,我改编了 example(来自 py2k),但似乎 csv.dictreader 对象没有长度。这是否意味着我只能迭代它?有没有办法把它分块?

这些问题似乎相关,但并没有真正回答我的问题: Number of lines in csv.DictReader, How to chunk a list in Python 3?

我的代码试图这样做:

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)

【问题讨论】:

    标签: csv python-3.x multiprocessing itertools chunking


    【解决方案1】:

    csv.DictReader documentation(以及它的子类csv.reader),该类返回一个迭代器。当您调用 len() 时,代码应该会抛出 TypeError

    您仍然可以将数据分块,但您必须将其完全读入内存。如果您担心内存问题,您可以从 csv.DictReader 切换到 csv.reader 并跳过 csv.DictReader 创建的字典的开销。为了提高csv2nodes() 的可读性,您可以分配常量来处理每个字段的索引:

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

    我还建议使用与 id 不同的变量,因为这是一个内置函数名称。

    【讨论】:

      猜你喜欢
      • 2021-10-03
      • 2017-12-30
      • 2011-08-16
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      相关资源
      最近更新 更多