亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 dill.dump 的字典列表(81,000,000 字節)需要永遠?

為什么 dill.dump 的字典列表(81,000,000 字節)需要永遠?

瀟瀟雨雨 2021-11-02 17:09:00
我制作了一個 8100000 字節的字典列表,其中包含 900 萬多個元素。每個元素都有一個包含 32 對值和鍵的字典,盡管在每個元素中使用相同的鍵集。我想保存它以備將來分析。我已經嘗試過 dill.dump,但是我不得不中斷內核花了很長時間(超過 1 小時)。這應該是快速而簡單的,對吧?這是我嘗試過的:import dilloutput_file=open('result_list', 'wb')dill.dump(result_list, output_file)output_file.close()我也試過泡菜和 bzip2import bz2import pickleoutput_file=bz2.BZ2File('result_list', 'w')pickle.dump(result_list, output_file)但是遇到了內存錯誤。有關使此操作可行且耗時更少的任何提示?謝謝!
查看完整描述

1 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

我是dill作者。您可能想嘗試klepto這種情況。 dill(實際上是任何序列化程序)都將整個dict對象視為一個對象……而這種大小的東西,您可能希望更像是一個條目數據庫……這是klepto可以做的。最快的方法可能是使用存檔,將每個條目視為磁盤上單個目錄中的不同文件:


>>> import klepto

>>> x = range(10000)

>>> d = dict(zip(x,x))

>>> a = klepto.archives.dir_archive('foo', d)

>>> a.dump()

以上創建了一個包含10000子目錄的目錄,每個目錄中都有一個條目。鍵和值都被存儲。請注意,您也可以稍微調整序列化方法,因此請查看文檔以了解如何為您的自定義案例執行此操作。


或者,您可以遍歷 dict,并在并行映射中使用 dump 序列化每個條目multiprocess.Pool。


(側面說明,我的作者multiprocess和klepto也)。


更新:當問題從序列化一個巨大的字典變為序列化一個巨大的小字典列表時......這改變了答案。


klepto是為大型dict結構而構建的,所以它可能不是你想要的。您可能想嘗試dask,它是為大型array結構而構建的。


我認為您還可以遍歷列表,單獨序列化每個列表條目......只要您以相同的順序加載它們,您就可以重新構建您的結果。你可以做一些事情,比如用值存儲位置,這樣你就可以恢復列表,然后在它們亂序時進行排序。


我還請您考慮是否可以將結果重組為更好的形式...


查看完整回答
反對 回復 2021-11-02
  • 1 回答
  • 0 關注
  • 310 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號