numpy, pandas出现Illegal instruction (core dumped)问题的解决方案

本文介绍了解决Pandas在读取CSV文件时出现非法指令(coredumped)错误的方法。错误原因是虚拟机标记了不支持的AVX/AVX2指令集。通过修改Numpy源代码并重新编译安装来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统信息:CentOS Linux release 7.2.1511 (Core),CPU:Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz

在近期的项目中使用pandas读取csv文件时出现状态码为132的Illegal instruction (core dumped)错误,经过调试

import pandas as pd
data=pd.read_csv('./data.csv')
发现使用read_csv()时会出现Illegal instruction (core dumped)错误,在google查询该问题后找到github上的两条相关的讨论帖:

read_csv throws Illegal instruction (core dumped) on a simple csv file

Numpy crashes during tests with a "Illegal instruction (core dumped)".
在按照第一条链接中的回复进行相关试验

import numpy as np

a = np.arange(0, 100, 1)
np.where(a>90)
发现同样出现Illegal instruction (core dumped)错误,同时会出现该错误的还有

pd.DataFrame()

pd.read_table('./data.csv',sep=',')

随后转到第二条链接找到相关信息及问题所在。查询相关问题时找到了在简书上的一篇博客:

Numpy在云虚拟机上crash问题

这里对其问题分析进行转述,详细可查看简书链接

 
root cause
  1. 宿主机CPU并不支持AVX或者AVX2标签,但是在创建虚拟机时,给系统打上了AVX/AVX2的tag。
  2. 当Pandas创建的DataFrame列大于31时,会走到AVX/AVX2的路径,因为虚拟机有AVX/AVX2的标签,但是执行到AVX/AVX2的逻辑时,因为宿主机并不支持,所以core dump Illegal instruction。
  3. 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
作者:biggeng
链接:https://www.jianshu.com/p/989d3aa8f5a2
來源:简书

解决方案:

1、删除系统已有的numpy库

pip uninstall numpy

2、下载numpy源代码

git clone https://github.com/numpy/numpy.git numpy
执行完成之后会在当前目录生成一个numpy目录 cd numpy/ 进入该目录

3、修改Numpy库文件

执行 cd numpy/core/include/numpy/ 在该目录下找到 npy_common.h 文件,建议使用ftp将其传到本地进行编辑(看的清楚,比较方便),找到第104行的位置(如图),将AVX/AVX2 设为0。

左边为修改前,右边为修改后。

这里贴上代码方便复制粘贴

#ifdef HAVE___BUILTIN_CPU_SUPPORTS



    #define NPY_CPU_SUPPORTS_AVX2 0




    #define NPY_CPU_SUPPORTS_AVX 0

#else
  #define NPY_CPU_SUPPORTS_AVX 0
  #define NPY_CPU_SUPPORTS_AVX2 0
#endif
linux下可以通过 vi/vim 编辑 npy_common.h ,:104 跳转到104行,修改代码后 :wq 保存退出。


4、编译并安装numpy

在安装前先确保安装了 cython, python-dev, python-pip

CentOS下:
yum install python-pip (一般都有不需要)
yum install python-devel
pip install Cython

Ubuntu下:
sudo apt-get install python-dev  
sudo apt-get install python-pip  
pip install Cython
在 numpy 根目录下执行

python setup.py build

编译过程中若是出现缺少相关module组件的话,可以自行安装后再执行编译

python setup.py install

完成之后重新测试 pandas.read_csv(), pandas.DataFrame() 等代码时若没有出现Illegal instruction (core dumped)错误,则成功解决了该问题。



### 关于 Jetson Nano 自启动失败以及 `Illegal instruction (core dumped)` 的解决方案 Jetson Nano 上出现 `Illegal instruction (core dumped)` 错误通常是由硬件不兼容、软件库版本冲突或者编译器优化设置不当引起的。以下是针对该问题的具体分析和解决方法: #### 1. **确认硬件支持** 确保所使用的 Python 库或框架能够完全适配 Jetson Nano 的 ARM 架构处理器[^1]。某些情况下,预构建的二进制文件可能未针对特定架构进行优化,从而引发指令集不匹配的问题。 #### 2. **调整 OpenBLAS 配置** OpenBLAS 是许多科学计算库(如 NumPy 和 PyTorch)依赖的核心组件之一。如果其核心类型与设备不符,则可能导致非法指令错误。可以通过以下命令尝试修复此问题: ```bash export OPENBLAS_CORETYPE=ARMV8 ``` 上述环境变量需在每次会话前手动加载,也可以将其写入 `.bashrc` 文件以便永久生效[^5]。 #### 3. **重新安装相关依赖包** 对于因版本不适配而产生的崩溃现象,建议卸载并重装涉及的关键模块。例如: ```bash pip uninstall numpy torch scipy pandas matplotlib seaborn -y pip install --no-cache-dir numpy==1.21.* torch torchvision torchaudio scipy pandas matplotlib seaborn ``` 注意选择适合 ARM 平台且经过验证稳定的版本号组合[^2]。 #### 4. **禁用 AVX 指令扩展** 部分第三方插件可能会默认启用高级矢量扩展功能(AVX),然而这些特性未必被所有嵌入式芯片组全面支持。因此有必要通过修改 CMakeLists.txt 或者 Makefile 来关闭对应选项后再自行编译所需工具链[^3]。 #### 5. **排查自启服务脚本中的隐患** 当系统进入开机初始化阶段执行到某个含有缺陷的应用程序时便会触发异常终止流程。此时应该仔细审查 rc.local 或 systemd unit files 中定义的任务列表是否存在潜在风险项[^4]: - 删除不必要的后台进程调用; - 将复杂操作延迟至网络连接建立之后再处理; - 对每一步骤增加日志记录便于后续定位根本原因。 --- ### 示例代码片段 下面给出一段简单的测试函数用于判断当前环境中是否仍然存在类似的 runtime fault : ```python try: import numpy as np a = np.array([1, 2, 3]) b = np.sin(a) except Exception as e: with open("/tmp/error_log.txt", 'w') as f: f.write(str(e)) finally: print("Test Completed.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值