2014-03-21 11 views
3

Мне нужно сравнить два больших CSV-файла. Но дело в том, что я должен перебирать каждую строку file1 со всеми остальными строками file2 и делать некоторые вычисления для разных столбцов.Как сравнить два огромных файла csv эффективно с меньшим временем

Часть моего кода, который я попробовал в питоне:

import csv 

def getOverlap(a,b): 
    return max(0, min(a[1], b[1]) - max(a[0], b[0])) 


masterlist = [row for row in c2] 

for hosts_row in c1: 
    chr1 = hosts_row[3] 
    a1 = [int(hosts_row[4]),int(hosts_row[5])] 
    found = False 
    for master_row in masterlist: 
     if hosts_row[7] == master_row[7]: 
      c3.writerow(hosts_row) 

      chr2 = master_row[3] 

      b1 = [int(master_row[4]),int(master_row[5])] 
      if getOverlap(a1,b1) != 0 and chr1 == chr2: 
       c5.writerow(hosts_row) 
      else: 
       c6.writerow(hosts_row) 


      found = True 
      break 
    if not found: 
     c4.writerow(hosts_row) 
     found2 = False 
     for master_row2 in masterlist: 
      chr2 = master_row[3] 
      b1 = [int(master_row[4]),int(master_row[5])] 
      if getOverlap(a1,b1) != 0 and chr1 == chr2: 
       c7.writerow(hosts_row) 
       found2 = True 
       break 
     if not found2: 
      c8.writerow(hosts_row) 

Но это занимает около 5 до 6 часов подряд. Есть ли более быстрый способ для этого. У меня 16-граммовый баран.

+0

Это может или не может помочь узнать размеры файлов. – PascalVKooten

+0

Почему бы не загрузить их в БД и запустить SQL-запрос? – Vor

ответ

2

Дело не в том, насколько велики ваши файлы, это вопрос вашей цели и дизайна алгоритмов.

  • один пункт должен определить, что такое differences.
  • Если строки упорядочены одинаково в обоих файлах, то две разные строки будут иметь разные столбцы.

Итак, возможно, вам стоит сначала рассмотреть сортировку файлов csv, чтобы порядок строк был идентичным, а затем вы можете просто использовать модуль filecpmp.

Я понимаю, что этот ответ на самом деле не добавляет никакого кода, но он предлагает некоторые мыслительные материалы. Это просто для одного комментария.

1

Использование Meld приложений в Linux (Ubuntu), чтобы сравнить файлы построчно

+0

Это приведет к переполнению памяти компьютера, если файлы ОЧЕНЬ большие. Если каждый составляет около 6 ГБ, а компьютер имеет только 8 ГБ оперативной памяти (например, средний ноутбук сегодня) ... вы можете видеть, что произойдет. Поэтому этот ответ довольно проблематичен. – Oz123

Смежные вопросы