python - 尝试扩展大量文件时,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"
解决方案
您可能不希望在这里直接展开,因为这会产生每个 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^
推荐阅读
- c++ - 在 while 循环中使用 std::cin 在添加多个数字时读取它们(循环不会终止)
- android - Android:如何将有关数字的数据从应用程序数据库提供给 android 手机应用程序 - 最近
- swift - SwiftUI:如果满足条件,如何为文本添加边框?
- image - 图像处理中的直方图均衡 python-Gonzalez e Woods
- javascript - 分配有会话属性的 JS 变量在页面重新加载之前为空
- java - 使用 Java SQL 时从运行行获取变量
- reactjs - React useContext 不会在状态更改时重新渲染
- flutter - 颤振:InternalLinkedHashMap
' 不是类型 'List 的子类型 在类型转换中 - python - 使用 Paramiko 执行远程主机的命令,并下载命令完成后创建的文件
- php - 需要在 foreach 循环 laravel 中对齐复选框