2010-01-26 27 views
4

我想我讀過Django的ORM懶洋洋地加載對象的地方。比方說,我想在批量更新操作中更新一大組對象(比如500,000)。我可以簡單地遍歷一個非常大的QuerySet,加載,更新和保存對象嗎?Django的QuerySets是否足夠緩慢以應對大數據集?

同樣,如果我想允許所有這些成千上萬的對象的分頁視圖,我可以使用內置的pagination facility或手動必須每次運行一個數據集上的窗口,因爲所有對象的QuerySet的大小?

回答

1

如果批量更新,可以使用SQL查詢,然後我想使用SQL查詢或者Django的ORM不會作出重大的區別。但是如果更新實際上需要加載每個對象,處理數據然後更新它們,則可以使用orm或編寫自己的sql查詢並針對每個處理後的數據運行更新查詢,開銷完全取決於代碼邏輯。

內置分頁設備運行的限制,偏移查詢(如果你正在做它正確的),所以我不認爲有在分頁主要開銷要麼..

+0

謝謝。不,更新在查詢中不可行。 – Joe 2010-01-26 19:36:53

-2

正如我這個基準爲我在一個表中的記錄2.5M數據集當前項目。

我讀信息和統計記錄,例如,我需要找到的記錄,這些領域的「名」是在一定的時間內更新一次以上的ID。 Django基準測試使用ORM來檢索所有記錄,然後遍歷它們。數據保存在列表中供將來處理。沒有任何調試輸出,除了結果打印結束。

在另一端,我是使用其執行相同的查詢(從Django中得到)和構建相同的結構,使用類用於存儲數據和在列表中保存的實例以供將來處理MySQLdb的。沒有任何調試輸出,除了結果打印結束。

我發現:

     without Django with Django 
execution time    x    10x 
memory consumption   y    25y 

我只是閱讀和計數,不執行更新/插入查詢。

嘗試探討這個問題自己,基準是並不難寫和執行。

+0

對不起10倍和25倍以上?直接的SQL查詢? – Joe 2010-01-26 17:33:20

+0

當我使用Django ORM時,與使用SQL查詢和將檢索數據作爲python列表操作時相比,完全讀取數據並執行一些活動花費了10倍的時間和25倍的內存。 – Vestel 2010-01-26 18:03:56

+3

-1。這是一個毫無意義的統計數據。另外,這取決於你如何使用ORM - 例如'len(queryset)'可能比'queryset.count()'效率低得多。 – 2010-01-26 19:29:01

3

如果評估500000 -result queryset,它很大,它會被緩存在內存中。相反,您可以在您的查詢集上使用iterator()方法,該方法將根據請求返回結果,而不會消耗大量內存。

此外,使用update()F()對象爲了在單個查詢中執行簡單的批量更新。

相關問題