首页 > 解决方案 > 尝试扩展大量文件时,Snakemake 挂起

问题描述

我正在尝试使用 Snakemake 读取 .txt 文件的大型英文语料库并在它们上运行 python 脚本,但是当我运行它时它似乎完全挂起 - 我已经离开了很长一段时间没有响应,而实际的脚本需要很短的时间来运行。

这是我当前的 Snakefile:

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"

标签: pythonpipelinesnakemake

解决方案


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

如果它挂在通配符上,您还可以包含通配符约束以帮助正则表达式引擎。

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

编辑以扩展最后一点:您当前的规则是获取所有输入和所有输出并将它们提供给脚本。假设这样ml/pos_tag.py做:

for infile, outfile in zip(snakemake.input, snakemake.output):
   # do work on infile and store in outfile

更改该脚本以处理单个输入文件以生成输出文件。(这是假设文件是​​独立的,如果您确实需要所有输入文件来进行输出,这是不对的。)

# do work on snakemake.input[0] and store in snakemake.output[0]

然后你的蛇文件变成:

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

rule all:
    input:
        expand("../../my_data_tagged/{dir}/{id}.txt",
               zip, dir=raw_dirs, id=raw_files)

rule p_tag:
    input:
        "../../my_data/{dir}/{id}.txt"
    output:
        "../../my_data_tagged/{dir}/{id}.txt"
    script:
        "ml/pos_tag.py"

主要优点是您可以让snakemake 并行化代码,而不是在python 中进行。

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

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

推荐阅读