2011-07-28 11 views
1

私はいくつかの小さなデータセットのために私のdjangoアプリケーションでmatplotlibを使用していくつかのカラフルな散布図を描画していますが、インポートステートメントは、javascriptのグラフ作成ユーティリティを使用して私の以前のバージョンと比較して、ページをロードするために1/2秒未満ではなく、ほぼ3秒かかる。私のオフィスのほとんどの人が気にしないにもかかわらず、それは私にはバグです。 - または多分異なるバックエンドが速くなるWebサーバー(django)アプリケーションのmatplotlibの読み込み時間を短縮する方法はありますか?

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas 
from matplotlib.figure import Figure 

fig = Figure(figsize=[7, 7]) 
canvas = FigureCanvas(fig) 
ax = fig.add_axes([1, 1, 5, 5]) 
ax.scatter(x, y, c=colors, s=15, linewidth=1.5) 
ax.set_xticklabels(labels, rotation=-40, horizontalalignment='left') 
fig.savefig(file) 

図をロードするために、より軽量の方法があります:

ここで基本的なコードですか?

私の同僚がウェブサイトから画像をコピー&ペーストできる必要があったため、javascriptユーティリティから切り替えました。私はmatplotlibを使う考えが好きです。なぜなら今、私はいくつかの魅力的なグラフを作ることができるからです。しかし、より良いパフォーマンスが得られるならば、別の軽量ツールを公開しています。

もう1つのアイデアは、常に実行されているクエリのポートをリッスンしてイメージを返す、何らかの種類のサーバーアプリケーションを作成することです。次に、各クエリに対してmatplotlibライブラリ全体をロードする必要はありません。しかし、それは多くの仕事のように聞こえる。

+0

メインビューでイメージをレンダリングしてファイルに保存しているのですか、別のビューでレンダリングして、HttpResponseを返していますか?キャッシングは可能ですか? –

+0

グラフを一時的なpngファイルに保存してから、メインビューテンプレートが一時ファイルへのパスを取得して表示します。人々はグラフをカスタマイズでき、ほとんどの画像は数回しか見えないので、キャッシングはあまり役に立ちません。 – brfox

答えて

1

イメージを別のビューでレンダリングする必要があります。これにより、画像(または画像)が生成されている間にブラウザがページのレンダリングを開始できるようになります。

def view(request): 
    ... 
    response=django.http.HttpResponse(content_type='image/png') 
    canvas.print_png(response) 
    return response 

http://www.scipy.org/Cookbook/Matplotlib/Djangoからコード)

さらに、Djangoのプロセスは、各ページ要求の後に死ぬべきではありません。将来のページリクエストのために複数のプロセスを維持するようにApache/Nginxを設定してみてください。各プロセスは、最初にイメージビューをレンダリングするときにimportステートメントを実行する必要があります。その後、スピードアップが必要です。

+0

これはページの残りの部分を最初にロードすることについての良い点です。また、毎回最初からリロードするようにApacheを設定しています。しかし、あなたは私がそこでいくつかのスピードアップを得ることができるように、私はそのApache設定を変更すべきであることは間違いありません。ありがとう。 – brfox

関連する問題