使用pyarrow读取feather文件时随机出现segfault段错误该如何解决?
pyarrow读取feather随机出现segfault的解决思路
- 优先升级pyarrow版本
你当前使用的pyarrow==5.0.0是2021年发布的老旧版本,该版本存在多个已知的多线程读取、格式解析相关的段错误bug。建议直接升级到当前最新稳定版,conda环境下执行conda install -c conda-forge pyarrow>=15.0.0即可,升级时注意同步升级pandas等依赖pyarrow的关联包,避免版本冲突。 - 禁用读取时的多线程
老版本pyarrow在glibc版本较低的Linux发行版(如你使用的openSUSE Leap 15.2)下,多线程读取容易出现内存竞争问题,触发随机段错误。你可以在to_table方法中添加use_threads=False参数关闭多线程,验证是否是多线程导致的问题:
options_data = options_data.to_table( filter=( (ds.field('dt') >= trade_days[0]) & (ds.field('dt') <= trade_days[-1]) ), columns=options_data_columns, use_threads=False )
- 验证feather文件完整性与版本兼容性
如果feather文件是用其他版本的pyarrow写入的,跨版本的格式不兼容也可能导致随机读取崩溃。你可以写个极简脚本循环读取所有用到的feather文件10次以上,定位是否是特定文件导致的崩溃;如果确认是写入版本问题,建议用当前环境的pyarrow版本重新写入所有feather文件。 - 排查环境依赖冲突
如果同时用过pip和conda安装pyarrow相关依赖,很可能出现动态链接库冲突的问题。你可以执行conda list | grep arrow检查是否存在多个版本的arrow包,或者执行ldd $CONDA_PREFIX/lib/libarrow.so检查是否链接到了系统自带的arrow动态库,若存在冲突,卸载所有arrow相关包后重新从conda-forge源安装即可。 - 定位崩溃具体位置
如果以上方法都无法解决,可以通过gdb运行脚本获取崩溃栈回溯确认问题根因:
gdb --args python your_script_path.py # 进入gdb后输入r运行,崩溃后输入bt即可打印完整调用栈
内容的提问来源于stack exchange,提问作者Deepak Krishna
相关产品推荐
相关产品推荐

