2 番目の Django サイトを立ち上げます。
私は過去にDjangoのORMで問題を抱えていました(基本的に、それが生成していたSQLは私が望んでいたものでselect_related()
はなく、本来あるべきものにそれをまとめることができなかったようなものを使用していました)-私は結局ビューですべてのDBクエリを手動で記述し、Djangoドキュメントから取得したこの関数を使用して、cursor
の応答を使用可能な辞書に変換します:
def dictfetchall(cursor, returnMultiDictAnyway=False):
"Returns all rows from a cursor as a dict"
desc = cursor.description
rows = [
dict(zip([col[0] for col in desc], row))
for row in cursor.fetchall()
]
if len(rows) == 1 and not returnMultiDictAnyway:
return rows[0]
return rows
サイトを立ち上げる準備がほぼ整いましたが、アプリをホストしようとした 2 つの異なる Web サーバーで、かなり大きなパフォーマンスの問題が見つかりました。
ローカルでは、非常に高速に実行されるわけではありませんが、一般的には、マシンが一般的に少し遅いためです。手元に数値はありませんが (後で追加します)、SQL 時間は狂ったように高くなく、MySQL を最適化する努力をしました (不足しているインデックスを追加するなど)。
これは、2 つの異なる Web ホストで実行されているアプリです (Google がこれらの URL をスパイダーするのを避けるために bit.ly を使用しています。申し訳ありません!):
- http://bit.ly/10iEWYt (Dreamhost でホストされ、Passenger WSGI を使用)
- http://bit.ly/UZ9adS (WebFaction でホストされ、WSGI も使用)
現時点ではDebug=False
、これらのホストの両方にあり (したがって、読み込みのペナルティはないはずです)、それぞれに 15 分のファイルベースのキャッシュがあります。Dreamhost では、15 分ごとにホームページにヒットする実験的な cronjob を使用して、これが Python サーバーを維持するかどうかを確認していますが、これはあまり効果がないようです。
これらのリンクを試してみると、クリックしたときにサーバーが応答するのにかかる時間がキャッシュを含めてわかるはずです (ホームページから別のページに移動してからホームに戻ってみてください)。
私はこのプロファイリングミドルウェアを試しましたが、結果を解釈する方法がよくわかりません (家にいるときに後でこの投稿に追加できます) - いずれにせよ、それが指す関数/行はすべて Django 自身のコード内にあるそれを自分の見解などと関連付けるのに苦労しました。
ここで上記の方法が問題になる可能性はありdictfetchall()
ますか? 私はそれを使用して、サイト上のすべての DB クエリの結果を処理します (ページあたり 5 ~ 10、ほとんどがホームページ上)。いくつかのテンプレートが含まれていますが、それほどクレイジーではありません。アルバム レビューを表示するなどの一般的な処理を行うためのコンテキスト プロセッサがあり、あらゆる場所で使用しています。この遅さの原因は他に何が考えられるのか、私は困惑しています。
ありがとう、これが役立つのに十分な情報であることを願っています。
編集: オーケー、ここにサイトのホームページのプロファイリング トレースがあります: http://pastebin.com/raw.php?i=c7kHNXAZ -- 正直に言うと、解釈に苦労しています。
また、デバッグ ツールバーの統計を調べました。246 ミリ秒で 8 つの SQL クエリ (現在、これらをさらに最適化することを検討中) ですが、レンダリングの合計時間は 3235 ミリ秒 (ローカル) でした。これが私を混乱させているものです。