Найти - Пользователи
Полная версия: Поиск повторяющихся элементов в большом кол-ве списков
Начало » Python для экспертов » Поиск повторяющихся элементов в большом кол-ве списков
1 2 3
WoMax
Хватит если скомпилировать.


artexcite
А что потом делают с этим большим списком? Может его и не нужно вовсе составлять?
FishHook
WoMax
А вы хитрый. Я пытался сделать словарь на 350 млн. ключей, а вы только на 100 тыс. Так и я могу.
WoMax
Да, точно. Я криво прочитал =\
PooH
А если такой вариант, схему данных оставляем как есть, добавляем таблицу <id элемента> - <счетчик вхождений>. Конечно это не нормальная форма, но раз схема и была денормализованной. Существующие данные, конечно, довольно долго будет обрабатывать, но зато вполне кусками, прочитали кусок таблицы, обновили счетчики. После вполне можно на триггеры повесить обновление таблицы со счетчиками.
FishHook
ИМХО: подобные данные (когда возникает нужда в хранении списков) вообще очень плохо накладываются на РСУБД, лучше сейчас отказаться от мускуля в пользу документо-ориентированного хранилища, чем потом десятилетия тащить за собой этот чемодан без ручки.
artexcite
py.user.next
Надо брать каждый список и потом брать каждый элемент списка.
Элементы сохраняются в сквозной словарь, где ключ - число из списка, а значение - количество встретившихся таких чисел.
Когда набирается нужное количество вхождений, число выдаётся на выход.
То есть не надо ничего выгружать, сохранять, соединять, всё делается на лету.

Приведите пожалуйста примерчик.
Я попробую реализовать этот алгоритм используя мои данные, но я думаю, что я столкнусь проблемой скорости выполнения и если во время выполнения скрипта произойдёт сбой (например, подключения к БД) то скрипт начнет работать заново.

WoMax
А что потом делают с этим большим списком? Может его и не нужно вовсе составлять?
Этот список нужно будет сохранить в текстовый блокнот.

Rodegast
У тебя должна быть вставка нескольких строк.
Как написать запрос на вставку всех строк при условии, что кол-во вставляемых строк разное?
Я могу привести БД к 3 нормальной форме, т.е. много-ко-многим.
В этом случае будет не одна, а три таблицы и их суммарный размер должен быть явно меньше 800 Мб.
artexcite
FishHook
ИМХО: подобные данные (когда возникает нужда в хранении списков) вообще очень плохо накладываются на РСУБД, лучше сейчас отказаться от мускуля в пользу документо-ориентированного хранилища, чем потом десятилетия тащить за собой этот чемодан без ручки.

Никогда не сталкивался с документо-ориентированными хранилищами. Интересно стало. М.б. посоветуйте какую-нибудь простенькую для изучения.
Rodegast
> Как написать запрос на вставку всех строк при условии, что кол-во вставляемых строк разное?

Делаешь кучу запросов в одной транзакции.

> Я могу привести БД к 3 нормальной форме, т.е. много-ко-многим.

На таблице связи создай уникальный индекс, за счёт этого дубли будут отсекаться.

> Никогда не сталкивался с документо-ориентированными хранилищами. Интересно стало. М.б. посоветуйте какую-нибудь простенькую для изучения.

https://ru.wikipedia.org/wiki/MongoDB
vic57
artexcite
Приведите пожалуйста примерчик.
Я попробую реализовать этот алгоритм используя мои данные, но я думаю, что я столкнусь проблемой скорости выполнения и если во время выполнения скрипта произойдёт сбой (например, подключения к БД) то скрипт начнет работать заново.
ну примерно так
 from random import randint
def f(d,lst):
    for i in lst:
        if not i in d:
            d[i] = 1
        else:
            d[i] += 1
l1 = [str(randint(100,200)) for i in range(1000000)]
l2 = [str(randint(1000,2000)) for i in range(1000000)]
l3 = [str(randint(2000,3000)) for i in range(1000000)]
d = {}
f(d,l1)
del l1
f(d,l2)
del l2
f(d,l3)
del l3
out = [i for i in d if d[i] >= 3]
print len(out),out
а чтобы данные не терять сохраняй словарь и номер строки таблицы в файл периодически
py.user.next
artexcite
Приведите пожалуйста примерчик.
Я попробую реализовать этот алгоритм используя мои данные, но я думаю, что я столкнусь проблемой скорости выполнения и если во время выполнения скрипта произойдёт сбой (например, подключения к БД) то скрипт начнет работать заново.
  
>>> import itertools
>>> 
>>> def func(seq, dct, num):
...     items = itertools.chain.from_iterable(seq)
...     for i in items:
...         dct[i] = dct.get(i, 0) + 1
...         if dct[i] == num:
...             yield i
... 
>>> list_1 = [1, 2, 3, 4, 5, 8, 8]
>>> list_2 = [3, 4, 5, 6, 7]
>>> list_3 = [3, 4, 5, 6, 7, 8]
>>> 
>>> db = [list_1, list_2, list_3]
>>> 
>>> list(func(db, {}, 3))
[3, 4, 5, 8]
>>>

То, что словарь не поместится в памяти, можно обойти через реализацию словаря через таблицу в базе данных. Есть такая возможность в sqlite3 сделать базу данных прямо в памяти.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB