Почему этот скрипт на python медленно пережевывает мою оперативную память?

#python #sqlalchemy #pymongo

#python #sqlalchemy #pymongo

Вопрос:

Этот скрипт медленно поглощает мою оперативную память. Когда я запускаю его, я вижу, что использование оперативной памяти Python увеличивается примерно на 1 мб с каждым циклом, но я не могу понять, почему. Я выяснил, что это итерация запроса, которая добавляет оперативную память, но это все, что я могу выяснить. Любая помощь была бы потрясающей.

 from haystack.pmod import piliPlacement #this is the SA model
from time import sleep
from datetime import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker


now = datetime.now()


engine = create_engine('mssql://xxxxxxx;uid=user;pwd=xxxxx',echo=False)


Session = sessionmaker(bind=engine)


def syncPlacements(session):
    query = session.query(piliPlacement).filter(piliPlacement.Time > now)
    pili_placements = [p.ID_Placement for p in query.all()] # this is what adds the RAM
    del pili_placements
    print 'loop'


while True:
    session = Session()
    syncPlacements(session)
    sleep(3)
  

Комментарии:

1. В этом коде есть явная ошибка, которая (вероятно) не связана. Вы проверяете if countPiliPlacements != countHaystackPlacements(): … обратите внимание, что первая часть — это функция, а не вызов функции.

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

3. Donkopotamus, виновен по обоим пунктам. Я только что обнаружил, что функция тоже .. упс! И вы правы, я должен согласовать идентификаторы.

4. @Donkapotamus, я упростил пример кода. Не могли бы вы взглянуть еще раз?

Ответ №1:

После того, как я вернул его обратно и пообщался с парнем по IRC-каналу SA, оказалось, что это проблема только для Mac OSX. Итак, я настроил его на Linux, но произошло то же самое. В конце концов, я прибегнул к запуску скрипта на crontab. Теперь работает нормально.

M

Ответ №2:

Возможно, вы захотите посмотреть, медленно увеличивается ли размер mdb по мере того, как он выполняет больше работы. Вот почему я бы предположил, что это произойдет. Это единственный объект, который не выглядит как собранный мусор в вашем примере, и он также является объектом. Итак, я бы определенно посмотрел, что он делает, поскольку он используется все чаще.

Мне было бы интересно, поддерживает ли он список выполненных запросов.

Комментарии:

1. Я вытащил все содержимое mdb , и оно все еще продолжало расти, поэтому я думаю, что, должно быть, неправильно обрабатываю сеанс SA. Спасибо monokrome

Ответ №3:

Всего 3 вопроса

Откуда session берется?

Почему бы не поместить mdb = Connection().haystack в while True цикл (и кстати session.close() тоже)? И передать mdb и session в syncPlacements ?

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

Комментарии:

1. 1. session происходит из haystack.pmod, который является моделью SA и настройкой движка. 2. Хороший момент 3. еще один хороший момент. Я собираюсь выполнить перезапись и посмотреть, что произойдет с проблемой памяти.

2. Я упростил пример кода. Не могли бы вы взглянуть еще раз?