Начну с небольшого лирического отступления.
У меня есть база данных MyQSL, хранящаяся на обычном хостинге. Выбор использования БД хостинга основывался на возможности удаленного подключения к БД из разных мест. К тому же, хостинг уже имелся до начала разработки проекта.
В базе имеется определенная, интересующая нас, таблица, которая имеет несколько столбцов. Один из столбцов содержит списки элементов, т.е. в ячейке хранятся данные следующего вида:
[123456, 23456789, 3456789, 41234567, 5678909, 64563223, 74456785, 8456788]
Для информации:
- столбец имеет тип данных mediumtext
- на данный момент таблица весит 800 Мб.
Ну, а теперь к сути:
Мне необходимо собрать из всех списков, элементы, которые повторяются 3 и более раз в разных списках, т.е. >=3.
Изначально я пытался сделать следующим образом:
1. Сделать выгрузку из всех строк таблицы из БД.
2. Из строки извлечь данные одной нас интересующей ячейки, т.е. список.
3. Склеить все 3 500 списков.
4. Выполнить что-то вроде:
i for i in set(mylist) if mylist.count(i) >= 3
1. Все сразу выгрузить не получилось, т.к. хостинг разорвал со мной соединение из-за таймаута. Слишком много сразу хочу – 800 Мб (сделал цикл по выгрузки по 20 строк и решил эту проблему).
2. Когда начал склеивать списки, то появилась другая проблема. Пусть у нас есть «глобальный список», хранящий в себе 3 500 списков. Так вот этот «глобальный список» стал настолько большим, что у меня не хватило 10Гб ОЗУ, т.к. в итоге «глобальный список» должен содержать около 200 миллионов элементов.
Посоветуйте и подскажите хоть что-нибудь, что мне поможет. Может у кого-то есть идеи по организации хранения данных в базе и поиску повторяющихся значений.
Готов пересмотреть всю концепцию моего неработающего алгоритма.