一次欲哭無淚的debug

我現有個服務,其中有段功能是將地理位置信息的json轉成protobuf,代碼不難:

import json
import geobuf

j = json.load(open('xx', 'r'))
pb = geobuf.encode(j)

對於一般json是沒什麼問題,但是最近遇到一個大到280m的json文件,一執行到這裏機器就被喫光內存卡死了,ssh都登錄不了,只能重啓T_T

試過json, geojson, simplejson, load 這280m json到內存都需要1個多g內存,再次T_T

但是我的服務器上有4g內存啊,怎麼也不至於爆掉啊,打開geobuf源碼看看改改,encode函數也沒啥東西,沒有太明顯的浪費內存可以改進的地方啊T_T

正在這時,我忽然發現在我本機,load+encode這個大文件最終只消耗了2g內存,並沒有爆掉,怎麼回事?

通過測試代碼,發現在服務器上相同python版本(3.5.2)多個虛擬環境中,有的好使,有的內存爆掉,但是它們python版本一致,geobuf,protobuf版本都一致,而且也檢測了geobuf和protobuf他們的依賴,也是一致,並且reinstall geobuf protobuf這些也沒有效果。T_T

爲什麼會出現這種效果,明明一樣的環境。。。。

我都有點開始懷疑底層庫了,沒辦法,python -v 執行上面代碼,當然是用個測試json,然後把兩個的輸出打印到文件,然後diff,終於在一大片日誌中,發現兩者的不同,壞的那個沒有import google.protobuf.pyext

這是什麼東西,分別到各種對應的目錄下查看,發現壞的環境在google/protobuf//pyext/下缺少一個.so ,到現在我覺得終於找到問題所在了

可是這個怎麼產生的,明明protobuf版本一致啊,重新安裝也沒有.so出現T_T

找到protobuf的github看了看,直覺覺得是安裝問題,回來看了看兩個環境的pip版本,果然,一個是1.5, 一個是19.2 (T_T)

升級pip,重新安裝protobuf,終於解決了T_T

 

解決了內存爆掉的問題,但是還沒解決一個json文件需要1個多g的問題,慢慢想辦法吧T_T

人生就是一個不斷遇到問題、不斷解決問題的過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章