因为pandas 初始化导致linux Segmentation Fault

环境配置django + djangorestframework + uwsgi + nginx

问题描述

程序有很多个下载文件的api,用的是djangoHTTPResponse类,,可是其中一个api在本地上是可用的,可是到了测试机就是返回一个连接服务器错误的提示.于是开始了排查

排查过程

  • 既然本地可用,那肯定是测试的服务器方面的原因了,首先是nginx,查看nginx错误日志可以找到
    《因为pandas 初始化导致linux Segmentation Fault》
    可以看出是因为后端服务器提前关闭导致了nginx报错,所以下一步去docker里的服务器查看
  • 最开始用的是独角兽服务器,根本没有报具体错误,后来换上uwsgi,终于看到了错误信息

    《因为pandas 初始化导致linux Segmentation Fault》

《因为pandas 初始化导致linux Segmentation Fault》

通过图片可以看到,uwsgi进程被杀死,然后用重启了一个进程,而被杀死的原因是
Segmentation Fault.于是一顿百度谷歌,大体意思就是这个错误时由于linux内存的问题,于是明白了因为我的电脑是mac, 而测试机是linux,所以会出现本地可用,测试机不可用. 知道了这个原因就去自己的代码里找原因

  • 通过打日志 找到原因出在了 dataFrame = pd.DataFrame(queryset, dtype='float')一句,这句是将django从数据库查出的模型直接转换成pandasDataFrame格式.说明pandas因为内存原因无法将这个模型成功转换,因为这个模型的其中一列是 path = models.TextField('path', max_length=4000),我怀疑是这个字段值太大导致的.于是将这个字段切割重排,最后问题解决
  • 尴尬的时候来了,我换了一种思路,将这个模型每一列值取出,用defaultdict(list)来存数据,在把这个字典转成DataFrame格式.竟能完美解决

总结

通过不断排查,解决办法就是将数据库查出的QuerSet类,把值取出来拼接成字典在进行pandas转换,,,,就可以了,,(之前是直接将QuerySet塞进pandasDataFrame方法中)

    原文作者:哲哲哲哲哲_40d1
    原文地址: https://www.jianshu.com/p/d0dd78e0c5b5?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞