Я пытаюсь загрузить десятки больших файлов (10-25 ГБ каждый) из некоторых общедоступных корзин S3. Я делаю это в контексте кластера 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.

2
merv 21 Дек 2019 в 03:14

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:
        "data/bam/{age}/{sample}.bam",
    run:
        os.chdir(os.path.dirname(output)) # move to dir with lots of space 
        S3.remote(remote_bam) # do the actual download
        os.rename(remote_bam, output) # move file to final destination
0
dariober 21 Дек 2019 в 12:38