You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyarrow读取Windows共享盘parquet文件时进程无响应如何解决

问题根因
  • pyarrow 6.0.0 存在Windows SMB挂载盘目录遍历的已知bug:该版本默认对传入的parquet目录做递归元数据预扫描,而SMB协议的元数据请求逻辑、文件锁机制和本地NTFS文件系统存在差异,扫描过程会触发不可恢复的IO系统调用阻塞,这也是观测到无CPU、内存占用的核心原因,进程完全卡在等待系统IO返回的状态。
  • 默认多线程读取策略和SMB协议不兼容:pyarrow默认启用多线程并发拉取文件元数据,SMB共享盘对高频并发小IO请求的处理容易触发排队死锁,尤其是共享盘存在访问权限校验延迟、带宽限速的场景下更容易触发。
  • 路径适配异常:部分pyarrow 6的Windows构建版本会自动将挂载盘路径转换为UNC网络路径,转换过程如果遇到共享路径包含特殊字符、域权限二次校验的场景,也会触发无响应阻塞。
可行解决方案
  • 升级pyarrow版本:优先升级到pyarrow 7.0及以上版本,官方在该版本已经修复了Windows SMB挂载盘的目录遍历死锁问题,多数场景下升级后即可直接恢复正常读取。
  • 禁用多线程元数据扫描:如果暂时无法升级版本,读取时添加use_threads=False参数,修改调用语句为pq.read_table("H:\\my\\parquet\\files", use_threads=False),强制单线程遍历文件元数据,规避并发请求死锁问题。
  • 手动遍历单文件读取后合并:如果禁用多线程仍无效果,可以先通过Python原生os库遍历目录下的parquet文件,逐个读取后合并,避免pyarrow直接扫描目录的逻辑,示例代码如下:
import os
import pyarrow as pa
import pyarrow.parquet as pq

parquet_dir = "H:\\my\\parquet\\files"
file_list = [
    os.path.join(parquet_dir, filename) 
    for filename in os.listdir(parquet_dir) 
    if filename.endswith(".parquet")
]

table_list = [pq.read_table(file) for file in file_list]
full_table = pa.concat_tables(table_list)
  • 显式指定本地文件系统实例:手动构造pyarrow的LocalFileSystem实例传入读取参数,避免路径自动转换的异常,示例如下:
from pyarrow.fs import LocalFileSystem
import pyarrow.parquet as pq

fs = LocalFileSystem()
table = pq.read_table("H:\\my\\parquet\\files", filesystem=fs)
  • 调整SMB挂载配置:在Windows挂载共享盘时勾选「登录时重新连接」选项,同时关闭共享盘的离线文件缓存,减少元数据请求的额外开销。

内容的提问来源于stack exchange,提问作者fata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:24:03