Форум сайта python.su
9
Хватит если скомпилировать.
artexcite
А что потом делают с этим большим списком? Может его и не нужно вовсе составлять?
Отредактировано WoMax (Июль 8, 2017 18:21:31)
Офлайн
568
WoMax
А вы хитрый. Я пытался сделать словарь на 350 млн. ключей, а вы только на 100 тыс. Так и я могу.
Офлайн
9
Да, точно. Я криво прочитал =\
Офлайн
72
А если такой вариант, схему данных оставляем как есть, добавляем таблицу <id элемента> - <счетчик вхождений>. Конечно это не нормальная форма, но раз схема и была денормализованной. Существующие данные, конечно, довольно долго будет обрабатывать, но зато вполне кусками, прочитали кусок таблицы, обновили счетчики. После вполне можно на триггеры повесить обновление таблицы со счетчиками.
Офлайн
568
ИМХО: подобные данные (когда возникает нужда в хранении списков) вообще очень плохо накладываются на РСУБД, лучше сейчас отказаться от мускуля в пользу документо-ориентированного хранилища, чем потом десятилетия тащить за собой этот чемодан без ручки.
Офлайн
0
py.user.next
Надо брать каждый список и потом брать каждый элемент списка.
Элементы сохраняются в сквозной словарь, где ключ - число из списка, а значение - количество встретившихся таких чисел.
Когда набирается нужное количество вхождений, число выдаётся на выход.
То есть не надо ничего выгружать, сохранять, соединять, всё делается на лету.
WoMaxЭтот список нужно будет сохранить в текстовый блокнот.
А что потом делают с этим большим списком? Может его и не нужно вовсе составлять?
RodegastКак написать запрос на вставку всех строк при условии, что кол-во вставляемых строк разное?
У тебя должна быть вставка нескольких строк.
Отредактировано artexcite (Июль 8, 2017 22:54:09)
Офлайн
0
FishHook
ИМХО: подобные данные (когда возникает нужда в хранении списков) вообще очень плохо накладываются на РСУБД, лучше сейчас отказаться от мускуля в пользу документо-ориентированного хранилища, чем потом десятилетия тащить за собой этот чемодан без ручки.
Отредактировано artexcite (Июль 8, 2017 22:54:53)
Офлайн
186
> Как написать запрос на вставку всех строк при условии, что кол-во вставляемых строк разное?
Делаешь кучу запросов в одной транзакции.
> Я могу привести БД к 3 нормальной форме, т.е. много-ко-многим.
На таблице связи создай уникальный индекс, за счёт этого дубли будут отсекаться.
> Никогда не сталкивался с документо-ориентированными хранилищами. Интересно стало. М.б. посоветуйте какую-нибудь простенькую для изучения.
https://ru.wikipedia.org/wiki/MongoDB
Офлайн
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
Офлайн
857
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] >>>
Офлайн