我现有个服务,其中有段功能是将地理位置信息的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
人生就是一个不断遇到问题、不断解决问题的过程