Python - Как удалить дубликаты в огромном CSV-файле (более 200 миллионов строк) - PullRequest
0 голосов
/ 24 августа 2018

Мы создали API распознавания изображений, который принимает URL-адрес изображения и отвечает на описание изображения. Этот процесс занимает около 5-20 секунд. У меня есть огромный CSV-файл, содержащий более 200 миллионов строк URL-адресов изображений из разных источников. Я обнаружил, что файл CSV содержит дубликаты URL-адресов изображений из разных источников. Поэтому мне не нужно отправлять все URL-адреса в API распознавания изображений, мне нужно отправлять только уникальные URL-адреса в API, но мне нужно заполнить ответ от API на все строки.

Я прочитал файл CSV кусками по 100 тыс. Строк, создал набор уникальных URL-адресов изображений, обработал их в API и снова заполнил результаты обратно в файл CSV. Но это привело к проблемам с памятью (16 ГБ ОЗУ), я не могу создать набор уникальных URL-адресов изображений с 200+ миллионами строк.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Два возможных подхода:

SQL Select Distinct

Загрузите CSV-файл в базу данных и используйте SQL Select Distinct и экспортируйте результат запроса в виде Csv-файла.В некоторых базах данных вы можете определить CSV-файл как таблицу и запустить SQL-запросы к CSV-файлу

Выбрать отдельный URL-адрес из UrlTable

Сортировать файл

Вы можете

  • Сортируйте файл по URL-адресу с помощью команды сортировки в операционных системах (в Windows и Linux есть команды сортировки).
  • Прочитайте файл и проверьте, отличается ли URL-адрес от последнего URL-адреса.,Вам нужно только проверить URL, когда он изменится
0 голосов
/ 24 августа 2018

Не уверен, подходит ли этот подход для такого огромного файла. Но вы можете попробовать.

import csv
entries = set()

with open("HugeCSVfile.csv", 'r') as lookuplist:
    for col in csv.reader(lookuplist):
        key = (col[0].lower()) # add rows you want to compare and remove the duplicates.
        if key not in entries:
            entries.add(key)
            print(key)
...