2014-03-19 12 views
0

比方說,我有一個頁面,我想呈現這將在幾個方面呈現一些(昂貴的計算)數據。例如,我想打我的數據庫並獲取一些大量的數據。然後,我想對這些數據進行分組,然後用Python進行操作(例如,使用Pandas)。說這個操作的結果是一些熊貓DataFrame,我會打電話prepped_data。說到這一點,一切都需要3秒鐘。 (即需要一段時間...)如何在單個URL上緩存數據以多種方式使用

然後,我想在一個URL(/summary)總結這些數據:我想顯示一個條形圖,餅圖和一個HTML表格。這些元素中的每一個都取決於prepped_data的子集。

我可以處理這個問題的一種方法是將3個獨立的視圖連接到3個獨立的URL。我可以製作pie_chart_view這將使動態生成的餅圖在/piechart.svg可用。我可以製作bar_graph_view,這將在/bargraph.svg上生成動態生成的條形圖。我可以通過渲染模板來完成summary_view。該模板將使用由summary_view本身生成的上下文變量來創建我的HTML表格。而且它還包括通過鏈接到模板內的URL的圖表。在這種結構中,所有3個視圖函數都需要獨立計算prepped_data。這似乎不理想。

作爲替代方案。我可以打開某種緩存。也許我可以創建一個名爲raw_data_view的視圖,這會使數據本身在/raw_data.json處可用。我可以設置它來緩存自己(使用任何Django緩存後端)一小段時間(30秒?)。然後,其他每個視圖都可以訪問此URL來獲取他們的數據,這樣我就可以避免進行3次昂貴的計算。但是,這似乎有點冒險,因爲在設置緩存時間方面有一些真實的判斷。

另外一條路徑可能涉及在summary_view內創建兩個圖形,並將圖形直接嵌入到呈現的HTML中(這可以通過.svg來實現)。但是我不是那麼喜歡的,因爲你會發現笨重的HTML文件和圖形,這些文件和圖形很難讓用戶隨身攜帶。更一般地說,我不想承諾以這種格式來做所有的圖形。

有沒有一個普遍接受的架構來處理這類事情?

編輯:我是如何製作的圖表:

一個評論問我是如何做的圖表。大致說來,我在matplotlib中這樣做。所以一旦我有我喜歡的代碼生成的Figure,我可以很容易地將它保存到svg

+0

看看[memoization](http://stackoverflow.com/questions/1988804/what-is-memoization-and-how-can-i-use-it-in-python)。這是一種非常通用的技術,可以用來緩存幾乎任何事情的計算結果。 –

+0

如果你解釋你如何製作圖表,這將有所幫助。 –

回答

0

我認爲你的想法是將準備好的數據存儲在一個文件中是一個好主意。我可能會命名該文件是這樣的:

/tmp/prepped-data-{{session_id}}.json

然後,您可以只在每個視圖稱爲get_prepped_data功能(SESSION_ID),要麼計算它或從文件中讀取它。當該函數被調用時,您也可以刪除舊文件。

另一種選擇是將數據直接存儲在用戶的會話中,以便在會話消失時將其清除。這種方法的可行性取決於需要存儲多少數據。

相關問題