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

问题描述 投票:0回答:1

我正在尝试使用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"
python pipeline snakemake
1个回答
0
投票

您可能不希望在此处直接扩展,因为这会产生每个dir / id对的乘积。传递“ zip”作为第二个参数以扩展以仅生成存在的目录/标识对。

如果悬挂在全局上,则还可以包括通配符约束以帮助正则表达式引擎。

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

编辑以扩展到最后一点:您当前的规则是获取所有输入和所有输出并将其提供给脚本。假设ml/pos_tag.py执行以下操作:

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

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

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

然后您的snakefile变为:

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^
© www.soinside.com 2019 - 2024. All rights reserved.