Python Snakemake在尝试扩展大量文件时挂起

Python Snakemake在尝试扩展大量文件时挂起,python,pipeline,snakemake,Python,Pipeline,Snakemake,我试图使用Snakemake读取大量英文.txt文件,并在其上运行python脚本,但在运行它时,它似乎完全挂起了—我将它保留了很长一段时间,没有响应,而实际的脚本运行时间非常短 这是我当前的蛇形文件: raw_dirs, raw_files = glob_wildcards("../../my_data/{dir}/{id}.txt") rule p_tag: input: protected(expand("../../my_data/{dir}/{id}.txt

我试图使用Snakemake读取大量英文.txt文件,并在其上运行python脚本,但在运行它时,它似乎完全挂起了—我将它保留了很长一段时间,没有响应,而实际的脚本运行时间非常短

这是我当前的蛇形文件:

raw_dirs, raw_files = glob_wildcards("../../my_data/{dir}/{id}.txt")


rule p_tag:
    input:
        protected(expand("../../my_data/{dir}/{id}.txt", dir = raw_dirs, id = raw_files))
    output:
        expand("../../my_data/tagged/{dir}/{id}.txt", dir = raw_dirs, id = raw_files)
    script:
        "ml/pos_tag.py"

您可能不希望在这里直接展开,因为这样会生成每个dir/id对的乘积。传入'zip'作为展开的第二个参数,以仅生成存在的dir/id对

如果它挂在globbing上,还可以包含通配符约束来帮助regex引擎

最后,我不确定您的脚本在做什么,但让您的规则一次处理一个文件而不是获取所有输入/输出可能会有所帮助

编辑以在终点展开: 您当前的规则是获取所有输入和输出,并将它们提供给脚本。比如说,
ml/pos_tag.py
的作用类似于:

对于填充,在zip中输出文件(snakemake.input,snakemake.output):
#进行填充工作,并将其存储在输出文件中
将该脚本更改为处理单个内嵌以生成输出文件。(这是假设文件是独立的,如果您实际上需要所有的输入文件来进行输出,这是不对的。)

#处理snakemake.input[0]并存储在snakemake.output[0]
然后你的蛇形文件变成:

raw_dirs,raw_files=glob_通配符(“../../my_data/{dir}/{id}.txt”)
规则所有:
输入:
展开(“../my_data_taged/{dir}/{id}.txt”,
zip,dir=raw\u dirs,id=raw\u files)
规则p_标签:
输入:
“../../my_data/{dir}/{id}.txt”
输出:
“../../my_data_taged/{dir}/{id}.txt”
脚本:
“ml/pos_tag.py”
主要的优点是您可以让snakemake并行化代码,而不是在python中进行

我更改了将zip添加到“全部展开”中,并删除了受保护的标记,该标记仅对输出有效。最后,我将输出存储在一个新目录中,否则后续运行将与输出匹配:

"../../my_data/tagged/d1/id10.txt"
#              ^  dir  ^ ^id^

虽然你所有的观点都很有帮助,但第三点对我来说可能是一个集中精力的好地方——但我很困惑,我以为我一次只通过了1分。我该如何正确地做这件事?编辑以扩展我的想法。另外,我没有注意到在存储输出时可能出现的递归。我认为扩展更改应该修复挂起,将输出移动到新目录将修复后续运行,规则更改将保持管道更干净。这很有效-非常感谢。您的示例还帮助澄清了有关snakemake流/语法的一些问题。