У меня есть папка из 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:]))