NextFlow 是否适用于面向文件的案例?
Does NextFlow work for file-oriented cases?
从这里重新发布,希望得到澄清。
提前致谢。
我对 NextFlow 完全陌生,我很困惑我不能做这个简单的事情,也找不到关于它的文档:我知道 NF 是面向通道的,但它能处理面向文件的情况吗正确吗?
我的意思是,假设您有常见的情况(请参阅 this example,从另一个讨论中重写):
- 进程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 processes are executed independently of each other and do not share a common (writable) state. The only way they can communicate is via asynchronous FIFO queues, called channels.
path
输入限定符允许在进程执行上下文中处理文件。 Nextflow 会将文件暂存在流程执行目录中,以便脚本可以访问它们。请注意,path
限定符是在版本 19.10.0 中引入的,作为 file
限定符的直接替代,应该是 preferred when using a recent version of Nextflow.
在您链接的代码中,storeDir 指令被三个进程中的每一个使用。这与 'the usual case' 场景相去甚远。 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 directive 来发布你的处理结果,通常使用 'copy' 模式,即:publishDir './results', mode: 'copy'
.它不适合所有工作流程,但它是一个很好的默认 IMO。然后,如果您出于某种原因想要,请从 'results' 文件夹中删除您的文件。当工作流程恢复时,Nextflow 将复制任何丢失的文件。此策略当然会在磁盘上保留已发布文件的两个副本。但是一旦你完成了工作流程,你可以简单地覆盖工作目录并将文件保存在 'results' 文件夹中。
从这里重新发布,希望得到澄清。
提前致谢。
我对 NextFlow 完全陌生,我很困惑我不能做这个简单的事情,也找不到关于它的文档:我知道 NF 是面向通道的,但它能处理面向文件的情况吗正确吗?
我的意思是,假设您有常见的情况(请参阅 this example,从另一个讨论中重写):
- 进程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 processes are executed independently of each other and do not share a common (writable) state. The only way they can communicate is via asynchronous FIFO queues, called channels.
path
输入限定符允许在进程执行上下文中处理文件。 Nextflow 会将文件暂存在流程执行目录中,以便脚本可以访问它们。请注意,path
限定符是在版本 19.10.0 中引入的,作为 file
限定符的直接替代,应该是 preferred when using a recent version of Nextflow.
在您链接的代码中,storeDir 指令被三个进程中的每一个使用。这与 'the usual case' 场景相去甚远。 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 directive 来发布你的处理结果,通常使用 'copy' 模式,即:publishDir './results', mode: 'copy'
.它不适合所有工作流程,但它是一个很好的默认 IMO。然后,如果您出于某种原因想要,请从 'results' 文件夹中删除您的文件。当工作流程恢复时,Nextflow 将复制任何丢失的文件。此策略当然会在磁盘上保留已发布文件的两个副本。但是一旦你完成了工作流程,你可以简单地覆盖工作目录并将文件保存在 'results' 文件夹中。