Я должен создать приложение, которое выполняет следующее (я должен только один раз разобрать данные и хранить их в базе данных):Найти все общие кортежи N размера в списке кортежей
Я дал K кортежи (с K над 1000000.) и каждого кортежа в виде
(UUID, (tuple of N integers))
Давайте предположим, что N равно 20 для каждого к-кортежа, и что каждые 20 размера кортеж отсортированы. Я сохранил все мои данные в базу данных в следующих двух формах (2 разных таблиц), так что я могу обрабатывать их более легко:
- _id, UUID, tuple.as_a_string()
- _id, UUID, 1st_elem, 2nd_elem, 3rd_3lem ... 20th_elem
цель состоит в том, чтобы найти все 10 размер кортежей из списка кортежей, таким образом, что каждый из этих кортежей существовать в более чем один 20 размере кортеж. **
Например, если нам даны два ING 20 размера кортежи:
(1, (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,161,17,18,19,20))
(2, (1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39))
общий кортеж: (1,3,5,7,9,11,13,15,17,19)
, который является 10-размера кортежа , так что получается нечто вроде следующего:
(1, 2, (1,3,5,7,9,11,13,15,17,19))
для того, чтобы достичь этого, что я сейчас делаю это (в Python 3):
- Создать набор с элементами 20 -si zed кортеж 1-й строки в базе данных.
- Создайте набор для каждой строки с элементами 20-размерного кортежа остальных строк в базе данных.
- Для каждого набора во втором списке множеств я пересекаюсь с первым набором.
- Затем я создаю комбинацию пересечения с 10 элементами (в Python это itertools.combinations (new_set, 10)), что дает мне результат, который я хочу.
Но эта процедура очень медленно. Даже используя многопроцессорную обработку, чтобы полностью использовать мои 8 ядер процессора, каждый компьютер для другого номера, он берет навсегда. У меня есть программа, работающая в течение 2 дней, и она только в 20%.
Есть ли у вас какие-либо идеи по оптимизации процесса? Будут ли массивы NumPy справляться со скоростью выполнения? Есть ли какой-либо способ в SQL рассчитать, что я хочу для каждой строки, даже по одной строке за раз?
Заранее спасибо.
Почему этот помеченный SQL? Каково ваше представление данных? –
Извините. Я хотел отметить только SQLite. Я пропустил клик. Мои данные представляют собой кортежи целых чисел размером 20, каждый с уникальным идентификатором, назначенным кортежу. – TIMace
если это sqlite, разве вы не должны писать SQL для этого вместо python? – deltaskelta