Удаление дубликатов строк сразу в файлах через pandas
Есть множество больших файлов (от 1гб и больше) в папке с множеством колонок, нужно сделать так, чтобы во всех файлах не было дублей строк (дубли 100% удаляются путем df=df.drop_duplicates()). Проблема в том, что объединить все файлы в один ДФ, удалить дубли, а потом опять разбить их на части я не могу, т.к. суммарно файлов где то на 65-70гб, соответственно, команда вида:
df = (pd
.concat(map(lambda file: pd.read_csv(file, sep=',', error_bad_lines=False, low_memory=False), file_in_folder)) \
.drop_duplicates()
.reset_index()
)
df = df.drop('index', 1)
кладет на лопатки анаконду и падает ядро. Из идей, которые пришли в голову, это брать каждый файл и каждый файл сравнивать с соседнем файлом удаляя дубликаты в первом. Но тут, по факту, будет процесс чтения каждого файла и сравнение с каждым, что опять приведет к падению ядра. Есть ли какие-либо еще идеи? На выходе, мне нужно множество (сколько их будет - без разницы) мелких файлов, между которыми точно нет дублей строк, чтобы потом, эти файлы засунуть в др. скрипт для дальнейшей обработки. Как вариант, можно попробовать локально поднять БД (например SQLite3) и засунуть в нее все файлы, а потом удалить дубли в ней и сохранить все обратно в файлы. Но пока не рассматриваю эту идею, т.к. все файлы имеют одинаковую структуру и содержат около 200 колонок и вложенные в ячейки словари.
Ответы (1 шт):
Воспользуйтесь Dask - он умеет работать с данными, объем которых значительно превышает объем свободной памяти.
PS правда работать это будет в несколько раз медленнее по сравнению с Pandas.
Также можно построить Apache Spark кластер - он позволяет "разделенно" и параллельно обрабатывать табличные данные на многих узлах кластера.