我們已經有了一個基於Python的web服務器,它在啓動時使用cPickle
取消了許多大數據文件。數據文件(使用HIGHEST_PROTOCOL
進行醃製)在磁盤上大約爲0.4 GB,並以大約1.2 GB的Python對象的形式加載到內存中 - 大約需要20秒。我們在64位Windows機器上使用Python 2.6。如何將1GB的對象反序列化爲比cPickle更快的Python對象?
瓶頸肯定不是磁盤(只需不到0.5秒,以實際讀取這麼多數據),但內存分配和對象的創建(有幾百萬個對象被創建)。我們希望減少20秒以減少啓動時間。
有什麼辦法來反序列化超過對象成Python的1GB比cPickle
快得多(如5到10倍)?因爲執行時間受內存分配和對象創建的約束,所以我認爲使用另一個不帶鉤子的技術,如JSON在這裏沒有幫助。
我知道有些解釋的語言有一種方法來他們的整個存儲器圖像保存爲一個磁盤文件,這樣他們就可以加載它放回內存中的所有一氣呵成,而無需爲每個對象分配/創建。有沒有辦法在Python中做到這一點,或實現類似的東西?
這可能是您獲得固態硬盤的機會。這是爲了加快開發?爲了讓你做快速部署? 閱讀數據或取消數據的滯後性?如果你從一個空實例開始,啓動時間是多少? – Scott 2010-11-16 14:59:53
請注意,我在我的問題中提到的瓶頸不是驅動器/讀取速度,而是取消打開和對象創建速度。對於快速部署來說更重要 - 讓我們的服務器能夠快速重啓。我不太確定這裏的「空實例」是什麼意思。 – 2010-11-16 15:08:28
對於一個750MB的pickle二進制文件,使用gc.disable()/ gc.enable()封裝cPickle加載調用,大幅縮短了所需的總時間20倍左右。見[這裏](http://stackoverflow.com/a/36699998/2385420) – 2016-04-18 17:42:03