#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. Я упростил пример кода. Не могли бы вы взглянуть еще раз?