1

从这里转发,希望澄清。

提前致谢。


我对 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')?

4

1 回答 1

0

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 将复制任何丢失的文件。这种策略当然会在磁盘上保留两个已发布文件的副本。但是一旦你完成了工作流程,

于 2021-08-14T14:46:09.317 回答