2014-10-06 1 views
2

У меня есть большая таблица в файле csv, которая содержит 5 миллионов строк и 4 столбца. Моя цель - взять каждую строку из первых 500 тыс. И сравнить ее со всеми следующими строками (т. Е. 5kk-n) на основе определенного условия. Условие - это что-то вродеРабота с большим csv в python

строка (n) .column1 == строка (n + 1) .column1 AND строка (n) .column2 == строка (n + 1) .column2 AND row (n) .column3 = = строка (п + 1) .column3

ИЛИ

ряд (п) == .column1 ряд (п + 1) .column1 и строки (п) == .column2 ряд (п + 1). столбец2 И ряд (п + 1) .column4.split() [0] в строке (п) .column4

Теперь я с помощью простого цикла над списками:

for idx,i in enumerate(big[:500000]): 
    for jdx,j in enumerate(big): 
     if (jdx>idx and i[0]==j[0] and i[1]==j[1] and i[2]==j[2]) or (i[0]==j[0] and i[1]==j[1] and j[3].split()[0] if j[3].split() else '' in i[3]): 
      matches.append([idx,jdx]) 

Это, очевидно, занимает очень много времени (около недели с использованием одного процесса). Pandas и numpy полезны для операций по всему массиву за раз, но я не знаю, смогу ли я каким-либо образом преобразовать эту задачу в них.

Итак, вопрос в том, как я могу ускорить процесс?

+0

Посмотрите на [ 'shift'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.shift.html # pandas.Series.shift) – EdChum

+1

Вы выполняете что-то вроде 1,2 триллиона if-утверждений. Поскольку у вас есть весь набор данных в первичной памяти, ввод-вывод не должен быть проблемой. Если потребуется неделя, то вы выполняете примерно 2 миллиона if-statements в секунду, что звучит довольно неплохо. Интересно, насколько быстрее это произойдет, даже если весь цикл написан на C? – Moose

+1

Вероятно, это не изменит время выполнения, но вы можете реорганизовать термины в логическом выражении: '' 'if i [0] == j [0] и i [1] == j [1] и ((jdx > idx и i [2] == j [2]) или (j [3] .split() [0], если j [3] .split() else '' в i [3])) '' ' – wwii

ответ

0

В результате я использовал следующие функции для повышения производительности.

  1. Отдельно петля в функции (около 20% прироста)
  2. Улучшенных логических операций.
  3. Б PyPy интерпретатор (300 +% увеличение)
Смежные вопросы