Я хочу сделать расчет на основе двух файлов данных.Калькуляция требует много памяти, поэтому я не могу сделать их все сразу.Я разделил задание на 200 частей, а затем запустил расчет по частям, которые позже были объединены.
Я автоматизировал это в Makefile:
.PHONY: SPLITS QOAC
.SECONDARY: QOAC SPLITS
NSETS = 200
DSETS := $(patsubst %,cache/split_%.rds,$(shell seq 1 1 $(NSETS)))
QSETS := $(patsubst %,cache/qoac_%.rds,$(shell seq 1 1 $(NSETS)))
QOAC: $(QSETS)
SPLITS: $(DSETS)
$(DSETS): split_files.R data/1 data/2
Rscript $< $(NSETS)
cache/qoac_%.rds: calc_qoac.R cache/split_%.rds
Rscript $^
bigfile: combine.R QOAC
Rscript $<
В этом примере NSETS
частигенерируется split_files.R
, который читает data/1
и data/2
.Наборы сохраняются в cache/split_*.rds
.
Для каждого split_*
, qoac_*
вычисляется с использованием calc_qoac.R
.Поскольку эти процессы изолированы, их можно запустить параллельно, запустив make -j
.
Моя проблема заключается в том, что если отсутствует 1 (+) из split_*
, split_files.R
запускается несколько раз.
Когда я добавляю .NOTPARALLEL: SPLITS
, весь сценарий запускается последовательно, что замедляет работу.
Как я могу убедиться, что генерация наборов выполняется только один раз, когда это необходимо?