一次欲哭无泪的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

人生就是一个不断遇到问题、不断解决问题的过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值