Win10下运行WikiExtractor处理维基XML转储报cannot find context for 'fork'错误
问题根本原因
- 初始
ValueError: cannot find context for 'fork'报错:fork是Unix/Linux/macOS系统专属的进程启动方式,Windows系统的Python多进程模块multiprocessing原生不支持该方式,而WikiExtractor默认代码硬编码了fork作为进程启动参数,因此在Windows环境运行直接触发报错。 - 替换为
spawn后TypeError: cannot pickle '_io.BufferedWriter'报错:spawn模式启动子进程时,需要将所有父进程传递给子进程的对象做序列化(pickle)处理,但WikiExtractor的原始代码直接将父进程打开的文件句柄传递给子进程,文件句柄属于不可序列化对象,因此触发序列化失败报错。
可行解决方案
方案1:单进程运行(无需修改代码,操作最简单)
直接在运行命令中添加--processes 1参数指定单进程执行,跳过所有多进程逻辑,即可避免进程启动方式相关的所有报错,命令如下:wikiextractor -cb 250K --processes 1 -o extracted D:\Wiki_dumps\ruwiktionary-20211120-pages-articles-multistream.xml.bz2
该方案缺点是提取速度比多进程慢,适合数据量不大的场景。
方案2:WSL环境运行(无需修改代码,可保留多进程性能)
在Windows系统中启用WSL(Windows Subsystem for Linux),安装Linux版本的Python和WikiExtractor,直接运行原始命令即可。WSL基于Linux内核,支持fork进程启动方式,不需要修改任何代码即可正常使用多进程提取,性能接近原生Linux环境。
方案3:修改代码适配Windows多进程
如果需要在Windows原生环境使用多进程提速,除了将Process = get_context("fork").Process中的fork改为spawn外,还需要修改WikiExtractor.py中的参数传递逻辑:移除传递给子进程的父进程文件句柄对象,改为子进程根据输出路径、分块编号等参数独立打开对应文件写入,避免不可序列化对象跨进程传递。
内容的提问来源于stack exchange,提问作者Shurup
相关产品推荐
相关产品推荐

