环境配置
django
+djangorestframework
+uwsgi
+nginx
问题描述
程序有很多个下载文件的api,用的是django
的HTTPResponse
类,,可是其中一个api在本地上是可用的,可是到了测试机就是返回一个连接服务器错误的提示.于是开始了排查
排查过程
- 既然本地可用,那肯定是测试的服务器方面的原因了,首先是
nginx
,查看nginx
错误日志可以找到
可以看出是因为后端服务器提前关闭导致了nginx报错,所以下一步去docker里的服务器查看 -
最开始用的是独角兽服务器,根本没有报具体错误,后来换上uwsgi,终于看到了错误信息
通过图片可以看到,uwsgi进程被杀死,然后用重启了一个进程,而被杀死的原因是
Segmentation Fault
.于是一顿百度谷歌,大体意思就是这个错误时由于linux内存的问题,于是明白了因为我的电脑是mac, 而测试机是linux,所以会出现本地可用,测试机不可用. 知道了这个原因就去自己的代码里找原因
- 通过打日志 找到原因出在了
dataFrame = pd.DataFrame(queryset, dtype='float')
一句,这句是将django从数据库查出的模型直接转换成pandas
的DataFrame
格式.说明pandas因为内存原因无法将这个模型成功转换,因为这个模型的其中一列是path = models.TextField('path', max_length=4000)
,我怀疑是这个字段值太大导致的.于是将这个字段切割重排,最后问题解决 - 尴尬的时候来了,我换了一种思路,将这个模型每一列值取出,用
defaultdict(list)
来存数据,在把这个字典转成DataFrame格式.竟能完美解决
总结
通过不断排查,解决办法就是将数据库查出的QuerSet
类,把值取出来拼接成字典在进行pandas
转换,,,,就可以了,,(之前是直接将QuerySet
塞进pandas
的DataFrame
方法中)