2012-04-03 114 views
6

我做了一个客户端应用程序,它使用HTTP通过一个简单的API与Python 2服务器进行通信。服务器相当广泛地使用SQLAlchemy的ORM来为这些HTTP请求提供数据。问题是即使只有很少的活动客户端,我的CPU使用率也非常高。这台服务器应该能够在每个客户端大约1次请求的同时为几百个客户端提供服务,所以它应该仍然是可管理的(或者我希望)。如何提高SQLAlchemy的性能?

我该如何提高性能?我知道问题是ORM,因为cProfile很清楚地显示了这一点。一个查询显然会执行大约10000条Python指令,这似乎很奇怪。我尝试插入不同的数据库引擎/后端,并将解释器更改为Pypy,但它显然无助于原始问题,也未改善性能。

我在这里做错了什么?我真的希望这是一个“好的,杜!”问题。

我的关系应该是不同的类型?渴望,懒惰,动态等?现在,我没有具体说明任何内容。

非常感谢。

+5

看看我的答案http://stackoverflow.com/questions/1171166/how-can-i-profile-a-sqlalchemy-powered-application/1175677#1175677一些地方开始 – zzzeek 2012-04-03 19:38:05

回答

0

查询的动态性如何?它只是一种总是被返回的对象类型,或者是多种不同的模型。你有多少行回来?你可以限制列数或行数吗?假设您已经修复了一切问题,那么即使python将列转换为正确的数据类型也会导致大量开销。

另外我SQLAlchemy只适用于快速项目,但有可能在等待结果时CPU使用率是尖峰的?如果这是您的问题,您可能需要深入分析正在运行的实际查询并确保它们已正确编制索引,并且orm以最佳方式生成它们。

+0

SQL查询是很少,并返回非常小的物品口袋。大部分时间都花在ORM本身上。 – Svenstaro 2012-04-20 08:54:24