Как я могу распараллелить алгоритм слияния CSV в Python? - PullRequest
0 голосов
/ 19 января 2019

У меня есть папка из 100 ГБ CSV-файлов, которые я хочу объединить в один CSV-файл. Имена файлов расположены в порядке расположения строк. Я написал однопоточный скрипт для решения этой проблемы, но он довольно медленный.

def JoinRows(rows_to_join, init=True):
    #rows_to_join is a list of csv paths.
    for i, row in enumerate(rows_to_join):
        with open('join_rows.csv', 'a') as f1:
            #join_rows.csv is just the output file with all the rows
            with open(row, 'r') as f2:
                for line in f2:
                    f1.write('\n'+line)

Я также написал рекурсивную функцию, которая не работает и не является параллельной (пока). Я думал соединить каждый CSV с другим, удалить второй из двух и повторять до тех пор, пока не останется только один файл. Таким образом, задача может быть разделена между различными доступными потоками. Есть предложения?

 def JoinRows(rows_to_join, init=False):
     if init==True: rows_to_join.sort()
     LEN = len(rows_to_join)
     print(LEN)
     if len(rows_to_join) == 2:
         with open(rows_to_join[0], 'a') as f1:
             with open(rows_to_join[1], 'rb') as f2:
                 for line in f2:
                     f1.write('\n'+line)
         subprocess.check_call(['rm '+rows_to_join[1]], shell=True)
         return(rows_to_join[1])
     else:
         rows_to_join.remove(JoinRows(rows_to_join[:LEN//2]))
         rows_to_join.remove(JoinRows(rows_to_join[LEN//2:]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...