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