Python параллельно сравнить 2 CSV-файлов - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь сравнить 2 файла CSV, которые содержат 100000 строк и 10 столбцов в каждом файле. Я запускаю этот код, он работает, но он использует только один поток процессора, в то время как у меня 8 ядер. Я хочу, чтобы этот код использовать все темы процессора. У меня есть поиск, и я нашел идею параллели. Но когда я пытаюсь применить параллельный цикл for в этом коде Python, это не работает. Как применить параллельно этот код? заранее благодарю за помощь!

import csv  
#read csv files
f1= file('host.csv','r')
f2= file('master.csv','r')
f3= file('results.csv','w') 

c1=csv.reader(f1) 
c2=csv.reader(f2)
next(c2, None)
c3=csv.writer(f3)
#for loop compare row in host csv file 
master_list = list(c2) 
for row in c1: 
    row=1
    found = False
    colA = str(row[0])  #protocol
    colB = str(row[11])  
    colC = str(row[12])  
    colD = str(row[13]) 
    colE = str(row[14])  
    #loop in each row of master csv file
    for master_row in master_list:
        results_row=row
        colBf2 = str(master_row[4])  
        colCf2 = str(master_row[5])  
        colDf2 = str(master_row[6])  
        colEf2 = str(master_row[7])  
        colFf2 = str(master_row[3])
        #check condition
        if colA == 'icmp':
           #sub condiontion
           if colB == colBf2 and colD == colDf2:
              results_row.append(colFf2)
              found = True
              break
           row = row + 1
        else:
           if colB == colBf2 and colD == colDf2 and colE == colEf2:
              results_row.append(colFf2)
              found = True
              break
           row =row+1
   if not found:
      results_row.append('Not Match')
   c3.writerow(results_row)
f1.close()
f2.close()
f3.close()

1 Ответ

0 голосов
/ 02 мая 2018

Дорогое задание - это внутренний цикл, который сканирует основную таблицу для каждой строки хоста. Поскольку python выполняет совместную многопоточность (вы можете искать «python GIL»), одновременно выполняется только один поток, поэтому несколько потоков не ускоряют связанную с процессором операцию. Вы можете создавать подпроцессы, но тогда вам придется взвесить стоимость передачи данных рабочим процессам по сравнению с приростом скорости.

Или оптимизируйте свой код. Вместо параллельной работы индексируйте мастер. Вы можете обменять дорогостоящее сканирование на 100000 записей для быстрого поиска в словаре.

Я позволил себе добавить в ваш код предложения with, чтобы сохранить несколько строк, а также пропустил разрывы colA и т. Д. (Используя именованные индексы), чтобы сохранить код небольшим.

import csv

# columns of interest
A, B, C, D, E, F = 0, 11, 12, 13, 14, 3

# read and index column F in master by (B,D) and (B,D,E), discarding
# duplicates for those keys
col_index = {}
with open('master.csv') as master:
    next(master)
    for row in csv.reader(master):
        key = row[B], row[D]
        if key not in col_index:
            col_index[key] = row[F]
        key = row[B], row[D], row[E]
        if key not in col_index:
            col_index[key] = row[F]

#read csv files
with open('host.csv') as f1, open('results.csv','w') as f3: 
    c1=csv.reader(f1)
    c3=csv.writer(f3) 
    for row in c1:
        if row[A] == "icmp":
            indexer = (row[B], row[D])
        else:
            indexer = (row[B], row[D], row[E])
        row.append(col_index.get(indexer, 'Not Match'))
        c3.writerow(row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...