Есть ли способ динамической загрузки данных в структуру данных Python без воссоздания - PullRequest
0 голосов
/ 09 января 2010

У меня есть процесс, который создает список из таблицы базы данных и работает в режиме реального времени. Время от времени новые данные добавляются в таблицу базы данных. Время от времени запрашивать данные из таблицы громоздко и отнимает много времени, и это должно быть как можно реальным временем. Каков правильный способ решения проблемы?

Процесс выглядит следующим образом

список получает сборку из SQL-запроса, выполнение которого занимает 2-4 секунды.

Список используется процессом А для выполнения некоторых функций

Данные постоянно добавляются в таблицу базы данных. Нам нужны только новые данные для добавления в список, который будет использоваться в режиме реального времени процессом A.

Я еще не пробовал писать какой-либо код, я все еще не уверен, какой это должен быть дизайн. Python - это единственный язык, который мы можем использовать, поскольку в системе уже развернуто 10 000 строк кода Python.

Может ли кто-нибудь помочь мне с правильным подходом, модулями и т. Д.?

EDIT

Процесс A - это процедура в программе. Код Pusedo, я думаю, что-то вроде этого

def processA(list):
   while 1:
      parse file 
      do something

def run():
   list = generate list from run sql query
   processA(list)


if __name__=="__main__":
   run()

Ответы [ 4 ]

0 голосов
/ 09 января 2010

Если данные добавляются в таблицу в программе, просто добавьте их в список одновременно.

Если в таблицу добавляются несколько источников, запросите в таблице все записи, первичный ключ которых> является последним полученным ключом.

0 голосов
/ 09 января 2010

Это кажется большим хаком, но на вашем начальном запросе создайте временную таблицу для хранения результатов. Добавьте столбец к этой таблице, который является увеличивающимся числом, которое я назову id. Добавьте в таблицу триггер с изменением данных, который обновит вашу временную таблицу. Проверьте базу данных и запросите только записи с идентификатором, превышающим последний элемент в вашем первоначальном запросе. Поскольку это будет намного более быстрый запрос, он должен приблизить вас к реальному времени, насколько это возможно. Повторное использование постоянного соединения также может немного помочь.

Я бы также проверил, что ваша база данных хорошо проиндексирована для этого запроса, 2-4 секунды кажется долгим. Возможно, вы также можете немного оптимизировать свой запрос.

0 голосов
/ 09 января 2010

Извините, довольно сложно определить, что именно вы хотите сделать.

Одна точка не совсем понятна:
Процесс (скрипт Python?) Должен быть запущен

  • непрерывно (по типу демона), - в этом случае вам не нужно хранить набор данных где-либо, если он относительно мал. Вы можете просто сохранить это в памяти.
  • периодически (задание cron), - в этом случае вам нужен способ сериализации данных между каждым вызовом. Для этого вы можете использовать pickle , однако я не уверен, что удаление будет занимать меньше времени, чем получение всего набора данных из базы данных.

Сброс зависит от схемы базы данных и способа добавления / обновления данных. Мутируется ли он вообще после того, как вставлен? Если нет, вы можете выбрать данные только «с момента последнего вызова», используя поле метки времени в таблице (если оно есть) или поле идентификации (на самом деле НЕ достоверно. Это своего рода надежно с MySQL, но опять же, не совсем).

Если данные могут быть обновлены, вам придется перечитать весь набор данных (если у вас нет способа выбрать только новые / обновленные записи).

Что касается 2-4 секунд, - может быть много причин, почему это занимает такое время, - вы выполняете запросы, в которых упоминаются неиндексированные поля?

0 голосов
/ 09 января 2010

Разве не имеет смысла просто снова запрашивать базу данных для всех новых данных, которые поступили с момента вашего последнего запроса? Что-то вроде key > highest_key_in_list или date > highest_date_in_list вместо того, чтобы загружать все заново.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...