Уведомления

Группа в Telegram: присоединиться | Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Ноя. 16, 2016 12:07:22

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 211
Репутация: +  7  -
Профиль   Отправить e-mail  

Самый оптимальный вариант чтения из базы, обработки и записи в файл

Задача:

Прочитать данные из MySQL базы, где может быть много миллионов записей. Каждую запись надо обработать (некая трансформация или вообще пропускается в зависимости от “консистенции”), выходные данные записываются в JSON-файл.

Вопрос:
оптимальное решение?

Первое, что мне пришло на ум: один поток считывает базу кусками, второй поток обрабатывает и пишет в файл. Можно ли здесь прикрутить как-то асинхронный подход и если да, то как? Будет ли выигрыш? Или есть еще какие-то архитектурные готовые решения?

п.с. Python 2.6



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#2 Ноя. 16, 2016 12:38:10

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 1389
Репутация: +  42  -
Профиль   Отправить e-mail  

Самый оптимальный вариант чтения из базы, обработки и записи в файл

База данных как раз и нужна что бы обрабатывать данные когда их миллион!
Пока не вижу никаких проблем делать выборки и работать с полученными результатами!

Офлайн

#3 Ноя. 16, 2016 17:27:29

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 211
Репутация: +  7  -
Профиль   Отправить e-mail  

Самый оптимальный вариант чтения из базы, обработки и записи в файл

Вот такие проблемы:

1) выборка миллиона записей из совокупности таблиц (используя UNION) и за неким критерием длится около 2-х минут;
2) когда же выборка закончена и на момент возвращения данных - cursor.fetchall, миллион записей забирает почти 400 МБ памяти, а это нехорошо;
3) итерирование по курсору (for record in cursor) вместо cursor.fetchall не дало изменений в потреблении памяти или скорости выполнения (или я где-то недопонимаю как работает курсор здесь и в чем тогда разница между итерированием и получением всех записей сразу)

Поэтому, хочется улучшить решение.



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#4 Ноя. 16, 2016 18:12:07

izekia
От:
Зарегистрирован: 2008-07-19
Сообщения: 317
Репутация: +  12  -
Профиль   Отправить e-mail  

Самый оптимальный вариант чтения из базы, обработки и записи в файл

Master_Sergius
может со стороны запроса подойти, я не знаток мускула, как там с паджинацией обстоит?



Офлайн

#5 Ноя. 16, 2016 19:16:23

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

Самый оптимальный вариант чтения из базы, обработки и записи в файл

Master_Sergius

1) Индексы проверь/настрой, EXPLAIN SELECT тебе в помощь.
2,3) cursor.fetchone пробовал?

Отредактировано Iskatel (Ноя. 16, 2016 19:16:46)

Офлайн

#6 Ноя. 16, 2016 19:21:57

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 2860
Репутация: +  150  -
Профиль   Отправить e-mail  

Самый оптимальный вариант чтения из базы, обработки и записи в файл

Master_Sergius
выходные данные записываются в JSON-файл.
1. Это непонятно. В один файл или файлов много?. Если в один то стандартными способами потребление памяти не снизить. Более того, потребители файла тоже будут ее жрать. И вообще выгружать данные из базы в json не самая лучшая идея, да и на самоцель тоже не тянет.
2. Время запроса зависит от запроса. Приведите текст. Но если вы собирались на максимальной скорости струячить данные с диска, то очевидно не надо было их в РСУБД класть. :) также как странная идея класть данные в json.



Офлайн

#7 Ноя. 17, 2016 17:10:32

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 211
Репутация: +  7  -
Профиль   Отправить e-mail  

Самый оптимальный вариант чтения из базы, обработки и записи в файл

Немного поработал над запросом, удалось в 10 раз увеличисть скорость. А насчёт json - файла, это так надо. Потому как в таком формате полученный “пакет” разсылается на различные устройства и всё такое.

И всё же, хотелось бы здесь увидеть какие-то интересные архитектурные решения для подобных задач



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#8 Ноя. 17, 2016 17:52:33

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

Самый оптимальный вариант чтения из базы, обработки и записи в файл

> Каждую запись надо обработать (некая трансформация или вообще пропускается в зависимости от “консистенции”)

Хранимки не пробовал использовать?





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

Офлайн

#9 Ноя. 17, 2016 18:02:11

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 211
Репутация: +  7  -
Профиль   Отправить e-mail  

Самый оптимальный вариант чтения из базы, обработки и записи в файл

Rodegast
> Каждую запись надо обработать (некая трансформация или вообще пропускается в зависимости от “консистенции”)Хранимки не пробовал использовать?

Ну, такая процедура будет выполняться раз в неделю, стоит ли?



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#10 Ноя. 17, 2016 19:22:40

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

Самый оптимальный вариант чтения из базы, обработки и записи в файл

Ну это тебе решать Просто тащить не нужные записи как-то не очень эффективно…





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

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version