在python中使用Pandas和Numpy库创建一个Pandas DataFrame是一个常见的操作,但就是这一个常见的操作也会在特定的场景下遇到问题。
笔者在使用Pandas DataFrame时,遇到了core dump的问题。去掉不相关的代码后,基本断定是如下代码引起core dump。
import numpy as np
np.random.seed(7)
import pandas as pd
df = pd.DataFrame(np.random.randn(1, 32))
经过验证后,发现只有在column大于31时,会crash。
经过搜索资料,发现原来是Numpy在某些虚拟机环境下的bug。具体原因在Numpy的git issue中描述。https://github.com/numpy/numpy/issues/9532
本文作一简单归纳:
root cause
- 宿主机CPU并不支持AVX或者AVX2标签,但是在创建虚拟机时,给系统打上了AVX/AVX2的tag。
- 当Pandas创建的DataFrame列大于31时,会走到AVX/AVX2的路径,因为虚拟机有AVX/AVX2的标签,但是执行到AVX/AVX2的逻辑时,因为宿主机并不支持,所以core dump Illegal instruction。
- core栈如下:
Program received signal SIGILL, Illegal instruction.
0xb61338a8 in LONG_greater_avx2 (args=args@entry=0xbfffe52c,
dimensions=dimensions@entry=0xbfffe538, steps=steps@entry=0xbfffe544,
__NPY_UNUSED_TAGGEDfunc=__NPY_UNUSED_TAGGEDfunc@entry=0x0)
at numpy/core/src/umath/loops.c.src:936
936 numpy/core/src/umath/loops.c.src: No such file or directory.
(gdb) bt
#0 0xb61338a8 in LONG_greater_avx2 (args=args@entry=0xbfffe52c,
dimensions=dimensions@entry=0xbfffe538, steps=steps@entry=0xbfffe544,
__NPY_UNUSED_TAGGEDfunc=__NPY_UNUSED_TAGGEDfunc@entry=0x0)
at numpy/core/src/umath/loops.c.src:936
解决方法
- 删除系统已有的numpy库
pip uninstall numpy
- 下载numpy源代码
git clone https://github.com/numpy/numpy.git numpy
-
修改Numpy库文件 numpy/core/include/numpy/npy_common.h, 将AVX/AVX2 设为0.
编译并安装numpy
python setup.py build
python setup.py install
安装后在新的shell下重新执行python脚本,问题解决。