Медленный синтаксический анализ списка с python3.7 для удаления дублирующихся элементов - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь удалить дубликаты элементов из большого текстового файла, содержащего 250 миллионов элементов на 4,4 гигабайта.

Я был впечатлен, увидев, что могу загрузить этот файл в список Python всего за несколько минут с помощью следующего кода:

x = []

with open("online.txt") as file:
    for l in file:
       x.append(l)

    print('count of array: ')
    print(len(x))

Но когда я попытался просто проверить, чтобы убедиться, что следующий элемент не существует, прежде чем добавить его в массив, он занял много часов. Я чувствую, что упускаю что-то простое, что действительно ускорит это.

Вот код, который я использовал для проверки дубликатов:

a = []
x = []

with open("online.txt") as file:
    for l in file:
        if l in a:
            print('duplicate')
            print(l)
        else:
            x.append(l.strip())
        a.append(l)

    print('with duplicates: ');
    print(len(a))
    print('without duplicates: ')
    print(len(x))

Он работает на сервере с 64 гигабайтами оперативной памяти и современными процессорами с двумя процессорами xeon.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

В итоге вот код, который я использовал для удаления дубликатов:

x = set([])

with open("all.txt") as file:
    for l in file:
       x.add(l)

    print('count of array: ')
    print(len(x))
0 голосов
/ 01 ноября 2018

Проблема в простом списке, python должен искать каждую запись каждый раз перед добавлением новой.

Вы можете попробовать словарь Python или набор вместо списка. Эти структуры данных быстрее определить, существует ли уже запись.

Просто измените свой код:

a = {}  # set
x = {}

with open("online.txt") as file:
    for l in file:
        if l in a:
            print('duplicate')
            print(l)
        else:
            x.add(l.strip())  # add to the set
        a.add(l)

Вы не указываете свой формат входного файла, но может произойти увеличение скорости, возможно, загрузив весь набор данных в гигантскую строку, а затем разделив его с помощью функций python, а не вручную, как вы делаете здесь.

...