как разделить объект чтения csv (dict) в python 3.2?

Я пытаюсь использовать Pool из модуля multiprocessing для ускорения чтения больших файлов csv. Для этого я адаптировал пример (из py2k), но похоже, что объект csv.dictreader не имеет длины. Означает ли это, что я могу только перебирать его? Есть ли способ его еще разбить?

Эти вопросы казались актуальными, но на самом деле не отвечали на мой вопрос: Количество строк в csv.DictReader, Как разбить список на части в 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)

person László    schedule 11.09.2011    source источник


Ответы (1)


Из csv.DictReader документацииcsv.reader класса он подклассы), класс возвращает итератор. Код должен был выдать TypeError при вызове len().

Вы по-прежнему можете разбивать данные на фрагменты, но вам придется полностью считывать их в память. Если вас беспокоит память, вы можете переключиться с csv.DictReader на csv.reader и пропустить накладные расходы на словари, создаваемые csv.DictReader. Чтобы улучшить читаемость в csv2nodes(), вы можете назначить константы для адресации индекса каждого поля:

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

Я также рекомендую использовать переменную, отличную от id, поскольку это имя встроенной функции.

person Kurt McKee    schedule 08.11.2011