我正在尝试使用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"
您可能不希望在此处直接扩展,因为这会产生每个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^