Я пишу компонент, который анализирует xml-фид с биржевыми котировками и сохраняет результат в базе данных. Проблема довольно проста, за исключением того, что канал не может быть прочитан постепенно. То есть, нет никакого способа указать, что вы хотите, чтобы X изменял только последнюю цитату или только изменения, более новые, чем X минут, скажем. Я знаю, что реальная проблема заключается в том, что канал глуп и что провайдер должен исправить свои вещи, но это не вариант, атм.
Лента представляет собой огромный XML-файл, который содержит 100000 последних котировок акций поставщика. Канал опрашивается один раз в минуту, в течение которого изменяется от 50 до 100 котировок. Остальные - повторяющиеся цитаты, которые читаются снова и снова и снова.
Во время каждого опроса канала я анализирую все кавычки (используя lxml) для объектов. Затем для каждого объекта цитаты я проверяю, существует ли цитата в базе данных. Если это произойдет, я откажусь от него, а если нет, я сохраню Эта процедура чрезвычайно расточительна, поскольку только около 0,1% - это новые данные, остальное - дубликаты. Чтобы немного его оптимизировать, я создаю таблицу поиска, запрашивая базу данных один раз для котировок, обновленных за последние X часов. Кавычки являются уникальными в базе данных по ключу (last_update, stock_id), поэтому эта оптимизация уменьшает количество запросов примерно на 50%.
Но все еще есть запросы по 50 КБ, где каждая цитата должна проверяться индивидуально, если она существует или нет, что очень обременительно для базы данных.
Итак, я ищу идеи о том, как ускорить мой анализатор каналов. Может быть, есть способ изменить последний извлеченный XML-файл новым?