私が取り組んでいる 1 つのアプリケーションに Flask を使用し、データを保存するために sqlalchemy と MySQL データベースを使用しています。テンプレート化には Jinja2 を使用します。開発中はすべて問題ありませんでしたが、より大きなデータセットを使用すると、大量のデータを含む一部の Web ページのレンダリングが非常に遅くなります。たとえば、ユーザーのリストは次のコードで処理されます。
def users():
q = Users.query.all()
out = []
for i in q:
try:
something_i_need = Table.query.filter_by(email=i.email).order_by(Table.date).first().id
except:
something_i_need = 0
out.append({
'id': i.id,
'last_name': i.last_name,
'first_name': i.first_name,
'middle_name': i.middle_name,
'phone': i.phone,
'team': i.team,
'status': i.status,
'needed': something_i_need,
'some_more_data': i.some_more_data
})
return render_template('users.html', list_of_users=out)
リストにはさらに多くのフィールドがあるため、データは少し単純化されています。一度に約 2000 人のユーザーを照会するこの場所への呼び出しには 10 秒以上かかり、ページの読み込みにも 10 ~ 20 秒かかります。テーブルは次のテーマ関数によってラップされています。このリンクの最初のテーブルです。いくつかの列で並べ替え関数を無効にすることは役に立ちましたが、それでも非常に遅いです。
では、このプロセスまたはテンプレートの生成を最適化して、これを高速化するにはどうすればよいでしょうか? これを Amazon EC2 インスタンスで実行していますPython 2.7.3 and mod_wsgi, Flask 0.9, Flask-SQLAlchemy=0.16, Jinja2==2.7, MySQL-python=1.2.4, SQLAlchemy=0.8.1
。ページネーションを作成し、一度に 100 程度のレコードを返す 1 つの「明白な」解決策は、並べ替えの目的 (主に日付) のためにすべてのユーザーをリストに含める必要があるため、実際に機能します。そのため、その解決策は最後の手段になります。
前もって感謝します!