Уведомления

Группа в Telegram: @pythonsu

#1 Июль 8, 2017 18:11:06

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

Поиск повторяющихся элементов в большом кол-ве списков

Хватит если скомпилировать.


artexcite
А что потом делают с этим большим списком? Может его и не нужно вовсе составлять?

Отредактировано WoMax (Июль 8, 2017 18:21:31)

Офлайн

#2 Июль 8, 2017 18:15:11

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Поиск повторяющихся элементов в большом кол-ве списков

WoMax
А вы хитрый. Я пытался сделать словарь на 350 млн. ключей, а вы только на 100 тыс. Так и я могу.



Офлайн

#3 Июль 8, 2017 18:34:08

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

Поиск повторяющихся элементов в большом кол-ве списков

Да, точно. Я криво прочитал =\

Офлайн

#4 Июль 8, 2017 19:29:53

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Поиск повторяющихся элементов в большом кол-ве списков

А если такой вариант, схему данных оставляем как есть, добавляем таблицу <id элемента> - <счетчик вхождений>. Конечно это не нормальная форма, но раз схема и была денормализованной. Существующие данные, конечно, довольно долго будет обрабатывать, но зато вполне кусками, прочитали кусок таблицы, обновили счетчики. После вполне можно на триггеры повесить обновление таблицы со счетчиками.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Июль 8, 2017 20:02:56

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Поиск повторяющихся элементов в большом кол-ве списков

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



Офлайн

#6 Июль 8, 2017 22:37:50

artexcite
Зарегистрирован: 2017-07-07
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск повторяющихся элементов в большом кол-ве списков

py.user.next
Надо брать каждый список и потом брать каждый элемент списка.
Элементы сохраняются в сквозной словарь, где ключ - число из списка, а значение - количество встретившихся таких чисел.
Когда набирается нужное количество вхождений, число выдаётся на выход.
То есть не надо ничего выгружать, сохранять, соединять, всё делается на лету.

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

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

Rodegast
У тебя должна быть вставка нескольких строк.
Как написать запрос на вставку всех строк при условии, что кол-во вставляемых строк разное?
Я могу привести БД к 3 нормальной форме, т.е. много-ко-многим.
В этом случае будет не одна, а три таблицы и их суммарный размер должен быть явно меньше 800 Мб.

Отредактировано artexcite (Июль 8, 2017 22:54:09)

Офлайн

#7 Июль 8, 2017 22:53:10

artexcite
Зарегистрирован: 2017-07-07
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск повторяющихся элементов в большом кол-ве списков

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

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

Отредактировано artexcite (Июль 8, 2017 22:54:53)

Офлайн

#8 Июль 9, 2017 00:00:12

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2750
Репутация: +  184  -
Профиль   Отправить e-mail  

Поиск повторяющихся элементов в большом кол-ве списков

> Как написать запрос на вставку всех строк при условии, что кол-во вставляемых строк разное?

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

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

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

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

https://ru.wikipedia.org/wiki/MongoDB



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Июль 9, 2017 01:02:19

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

Поиск повторяющихся элементов в большом кол-ве списков

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
а чтобы данные не терять сохраняй словарь и номер строки таблицы в файл периодически

Офлайн

#10 Июль 9, 2017 02:02:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Поиск повторяющихся элементов в большом кол-ве списков

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 сделать базу данных прямо в памяти.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version