GNU Make: разделить файл (серийный), затем работать на части (параллельный) - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу сделать расчет на основе двух файлов данных.Калькуляция требует много памяти, поэтому я не могу сделать их все сразу.Я разделил задание на 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, весь сценарий запускается последовательно, что замедляет работу.

Как я могу убедиться, что генерация наборов выполняется только один раз, когда это необходимо?

1 Ответ

0 голосов
/ 12 февраля 2019

Мне удалось заставить его работать, перейдя по этой ссылке .
Это заставило меня использовать цель PHONY.Я думал, что уже сделал это, с SPLITS и QOAC, но теперь я решил это так:

cache/split_%.rds: SPLITS

SPLITS: split_files_qoac.R data/INR_data.rds data/patient_data.rds
    Rscript $< $(NSETS)

cache/qoac_%.rds: calc_qoac.R cache/split_%.rds
    Rscript $^
...