2013-10-11 53 views
2

我正在使用我的Django應用程序需要定期檢索的數據量較大的一組(約30000條記錄)。這些數據並沒有經常變化(可能每個月大概一次),並且所做的更改是在一批中完成的,所以我試圖達到的數據庫解決方案几乎是隻讀的。將靜態Django數據庫加載到內存中

該數據集的總大小約爲20mb,我的第一個想法是我可以將它加載到內存中(可能作爲對象的單例)並以這種方式訪問​​它非常快,但我想知道是否有是通過避免磁盤I/O來縮短獲取時間的其他更有效的方法。 memcached會成爲這裏最好的解決方案嗎?或者將它加載到內存中的SQLite數據庫更好?或者在應用程序啓動時加載它只是作爲內存中的變量?

回答

2

我認爲這是加載的所有對象到內存與

cached_records = Record.objects.all() 
list(cached_records) # by using list() we force Django load all data into memory 

然後你可以自由在你的應用程序來使用這個cached_records最簡單的解決方案,您還可以使用查詢集方法如filter等,但緩存記錄上的filter將觸發數據庫查詢。

如果您將根據條件查詢這些記錄,使用緩存將是一個好主意。

+0

我用這種方法運行的問題是list()函數在模塊導入時進行評估。這使得所有的測試都失敗了,因爲測試數據庫還不存在,所以查詢崩潰了,並且都不好。我也遇到了同樣的問題,但是這個解決方案正在縮小... – mlissner

0

磁盤IO是否真的成爲應用程序性能的瓶頸並影響用戶體驗?如果沒有,我不認爲這種優化是必要的。

操作系統和RDBMS(例如MySQL,PostgresQL)現在真的很聰明。磁盤中的數據將被RDBMS和OS自動緩存在內存中。

+0

我不確定這個瓶頸會產生多少,但是因爲它只有20mb的數據,所以我認爲最好將它加載到內存快速訪問。我將研究這些數據庫的默認緩存策略,儘管我可能會使用可以控制更多的緩存層,例如memcached。 – sashimiblade

相關問題