尝试扩展大量文件时 Snakemake 挂起
Snakemake hangs when trying to expand large number of files
我正在尝试使用 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' 作为第二个参数传入以展开以仅生成存在的 dir/id 对。
如果它挂在 globbing 上,您还可以包括通配符约束以帮助正则表达式引擎。
最后,我不确定您的脚本在做什么,但是让您的规则一次处理一个文件而不是处理所有文件可能会有所帮助 inputs/outputs。
编辑以扩展最后一点:
您当前的规则是获取所有输入和所有输出并将它们提供给脚本。假设 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^
我正在尝试使用 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' 作为第二个参数传入以展开以仅生成存在的 dir/id 对。
如果它挂在 globbing 上,您还可以包括通配符约束以帮助正则表达式引擎。
最后,我不确定您的脚本在做什么,但是让您的规则一次处理一个文件而不是处理所有文件可能会有所帮助 inputs/outputs。
编辑以扩展最后一点:
您当前的规则是获取所有输入和所有输出并将它们提供给脚本。假设 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^