nextflow - NextFlow 是否适用于面向文件的案例?
问题描述
从这里转发,希望澄清。
提前致谢。
我对 NextFlow 完全陌生,我很困惑我不能做这个简单的事情,也找不到关于它的文档:我知道 NF 是面向通道的,但它可以正确处理面向文件的案例吗?
我的意思是,假设您有通常的情况(请参阅此示例,从另一个讨论中重写):
- 进程A,创建文件a
- 进程 B,创建文件 b
- 进程 C,用 a+b 做某事并创建 c(例如,连接 a 和 b)
现在,我删除文件 a,我希望 A 和 C 被重新执行,C 处理新的 a 和现有的 b 并重新创建 c。
也就是说,
- 如果我以常规方式执行此操作,即将文件放入工作目录,则删除工作文件非常困难,因为我必须使用散列名称翻找日志和目录,直到找到我需要的内容。我希望能够只删除 a 或 b (或者,只删除
touch
它们)。 - 我已经尝试过
storeDir
并且文件日期被完全忽略,如果 a 不存在,但 c 存在,则 A 被重新执行但 C 不存在并且旧的 c 被保留。 - 我认为
publishDir
也不会起作用,因为我希望它像第一种情况一样工作(因为文件保留在工作目录中,除了mode='move'
,只能在最后一步中使用)。
我是否遗漏了什么,或者 NF 不适合像上面这样的面向文件的情况?
此外,有没有办法只运行一个管道到一个给定的进程(例如,指定'A')?
解决方案
Nextflow进程彼此独立执行,不共享公共(可写)状态。他们可以通信的唯一方式是通过异步 FIFO 队列,称为通道。
输入限定符允许在path
流程执行上下文中处理文件。Nextflow 将在流程执行目录中暂存文件,以便脚本可以访问它们。请注意,path
限定符是在 19.10.0 版本中引入的,作为限定符的替代品,在使用最新版本的 Nextflow 时file
应该首选。
在您链接的代码中,三个进程中的每一个都使用storeDir指令。这与“通常情况”的情况相去甚远。storeDir 指令指定的目录旨在作为进程结果的永久缓存。通常,这些类型的流程会产生很大的一次性成本,您希望避免在以后的运行中再次支付。
我重构了您的示例,以表明当从工作目录中删除文件“a”时,进程 A 和 C 确实被重新执行:
process A {
output:
path 'a.txt' into a_ch
"""
seq 1 3 > a.txt
"""
}
process B {
output:
path 'b.txt' into b_ch
"""
seq 4 5 > b.txt
"""
}
process C {
input:
path a_txt from a_ch
path b_txt from b_ch
output:
path 'c.txt'
"""
cat "${a_txt}" "${b_txt}" > c.txt
"""
}
$ nextflow run test.nf
N E X T F L O W ~ version 20.10.0
Launching `test.nf` [agitated_payne] - revision: baea5be781
executor > local (3)
[29/4bba82] process > A [100%] 1 of 1 ✔
[d8/978a8d] process > B [100%] 1 of 1 ✔
[14/999791] process > C [100%] 1 of 1 ✔
$ find . -type f -name '*.txt'
./work/14/9997911fcc4587f565822e4c8a238c/c.txt
./work/29/4bba8269b9337f28d20225d605b7cf/a.txt
./work/d8/978a8df7e7e1e5885007ebb0e2915d/b.txt
$ rm ./work/29/4bba8269b9337f28d20225d605b7cf/a.txt
$ nextflow run test.nf -resume
N E X T F L O W ~ version 20.10.0
Launching `test.nf` [grave_albattani] - revision: baea5be781
executor > local (2)
[7a/ec8636] process > A [100%] 1 of 1 ✔
[d8/978a8d] process > B [100%] 1 of 1, cached: 1 ✔
[2d/c2d34c] process > C [100%] 1 of 1 ✔
说了这么多,我仍然不清楚为什么首先需要从工作目录中删除文件。在不知道您要达到什么目的的情况下,我会说避免接触工作目录中的文件,而是使用publishDir 指令来发布您的流程结果,通常使用“复制”模式,即:publishDir './results', mode: 'copy'
。它不适合所有工作流程,但它是一个很好的默认 IMO。然后,如果您出于某种原因想要删除,请从“结果”文件夹中删除您的文件。当工作流程恢复时,Nextflow 将复制任何丢失的文件。这种策略当然会在磁盘上保留两个已发布文件的副本。但是一旦你完成了工作流程,
推荐阅读
- mariadb - 检查刚刚安装的 MariaDB 10.3 数据库的状态时出错
- c# - 使用 GetComponent 在 Unity (C#) 中禁用其他脚本时出现 NullReferenceException
- project-reactor - 在 Project Reactor 中调用订阅的消费者参数是顺序的吗?
- php - 用PHP直接从多维数组中指向一个元素
- r - 如何将 scale_y_continuous(labels = scales::percent) 更改为
- neo4j - Neo4j 最大深度和路径
- c - 如何在 TCP 中获取原始 IP 而不是代理的 IP?
- c++ - 命名文本文件并使用函数显示平均值
- powershell - 拆分路径从服务路径名中删除“”
- java - Java 如何将回调转换为 Promise?