2011-11-10 40 views
3

这个脚本慢慢地吃我的RAM。当我运行它时,我可以看到Python的RAM使用率在每个循环中都大约增加了1mb,但我无法弄清楚为什么。我已经发现它是查询的迭代增加了RAM,但这就是我所能想到的。任何帮助都是极好的。为什么这个python脚本慢慢咀嚼我的RAM?

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) 
+0

这段代码中有一个明显的错误,可能是不相关的。你正在检查'if countPiliPlacements!= countHaystackPlacements():'......注意第一部分是函数,而不是函数调用。 – donkopotamus

+0

并且检查每个数据库中的项目数量并不是一种可靠的同步方法......如果有人在三秒钟内删除并将项目添加到一个数据库中,您将无法检测到它。 – donkopotamus

+0

Donkopotamus,两人都有罪。我刚刚发现了功能的东西..哎呀!你说得对,我应该调和身份证。 – MFB

回答

2

在剥离它之后,和SA IRC频道上的人聊天,它似乎是Mac OSX唯一的问题。所以我在Linux上设置它,但同样的事情发生。最后,我诉诸于在crontab上运行脚本。现在工作正常。

M

0

你可能想看看MDB慢慢变大,因为它做更多的工作。这就是为什么我会认为这会发生。它是唯一看起来不像在你的例子中被垃圾收集的对象,它也恰好是一个对象。所以,我一定会研究它在做什么,因为它越来越多地被使用。

我不知道它是否维护已执行的查询列表。

+0

我拿出所有* mdb *的东西,它仍然不断攀升,所以我认为我必须错误地处理SA会话。谢谢monokrome – MFB

0

仅有3问题

来自哪里session

为什么不把mdb = Connection().haystack纳入while True循环(和btw session.close()太)?并通过mdbsessionsyncPlacements

整个代码块只有两个不同(即计算匹配,保存或删除)复制?

+0

1.'session'来自haystack.pmod,它是SA模型和引擎设置。 2.好点3.另一个好点。我要重写一下,看看内存问题会发生什么。 – MFB

+0

我简化了代码示例。你能再看一次吗? – MFB