我正在尝试从一些公共S3存储桶中下载数十个大文件(每个文件10-25 GB)。我是在HPC群集的用户存储配额有限的情况下执行此操作的。通常,我的用户目录下有Snakemake管道,但其中包含一个存放大型文件的符号链接文件夹(data
)。
我尝试运行以下内容:
from snakemake.remote.S3 import RemoteProvider as S3RemoteProvider
S3 = S3RemoteProvider()
rule all:
input:
"data/bam/3_month/10X_P4_0.bam",
"data/bam/3_month/10X_P4_1.bam",
"data/bam/3_month/10X_P4_2.bam"
rule bam_download_s3:
input:
bam=lambda wcs: S3.remote("czb-tabula-muris-senis/10x/%s/%s/possorted_genome_bam.bam" % (wcs.age, wcs.sample))
output:
"data/bam/{age}/{sample}.bam"
shell:
"""
cp {input.bam} {output}
"""
尽管使用的是放大版本,但我基本上是在下载所有内容,并使用--cluster
和-j
标志来实现。
我希望这可以将多个作业推送到我的群集中,并且每个作业都下载其分配的文件。相反,Snakemake开始使用存储桶路径将本地进程中的每个文件下载到本地文件夹中。我没有等待它耗尽我的配额(这很容易拥有),但是看起来集群作业最终只会复制本地文件。
Snakemake中是否可以直接将下载推送到群集作业并指定下载位置?
我可以想到一些解决方法:例如,创建一个以存储桶名称作为Snakemake将临时文件转储到其中的别名的符号链接文件夹。或完全放弃Snakemake的RemoteProvider(除了验证文件是否存在),并使用单独的CLI工具从S3下拉。但是,这一切都打破了Snakemake似乎旨在提供的跨遥控器透明使用的饰面。
答案 0 :(得分:1)
我无法对此进行测试,但是没关系:
remote_bam = "czb-tabula-muris-senis/10x/{age}/{sample}/possorted_genome_bam.bam"
rule bam_download_s3:
input:
# Some logic to only check the remote file exists and is older than output.
# `stay_on_remote= True` may do the trick
bam=S3.remote(remote_bam, stay_on_remote=True)
output:
bam="data/bam/{age}/{sample}.bam"
params:
# use this for the wildcard substitution
bam=remote_bam
run:
os.chdir(os.path.dirname(output.bam)) # move to dir with lots of space
S3.remote(params.bam) # do the actual download
os.rename(params.bam, output.bam) # move file to final destination