2015-03-31 97 views
0

我正在嘗試使用Makefile執行數據管道。我有一個很大的文件,我想分成小塊進行並行處理。事先不知道子集的數量和每個子集的大小。例如,這是我的文件具有可變數量目標的Makefile

$ for i in {1..100}; do echo $i >> a.txt; done 

Makefile中的第一步應計算範圍,...可以讓他們固定的,現在

ranges.txt: a.txt 
    or i in 0 25 50 75; do echo $$(($$i+1))'\t'$$(($$i+25)) >> [email protected]; done 

下一步應該ranges.txt閱讀,在ranges.txt,a_1.txt,a_2.txt,a_3.txt,a_4.txt中爲每個範圍創建一個目標文件。其中a_1.txt包含第1至25行,a_2.txt第26-50行等等...可以這樣做嗎?

+1

您無法直接生成文件並將其用作單個make的目標輸入。你可以通過教授如何生成一個包含的makefile來做這種事情。 – 2015-03-31 16:08:00

回答

2

你不說你正在使用什麼版本,但我會假設GNU make。有幾種方法可以做到這一點。我寫了一組關於metaprogramming in GNU make的博客文章(我的意思是自動生成自己的規則)。

如果是我,我可能會使用constructed include files方法。所以,我想你的規則在ranges.txt之上,而不是創建一個makefile,或許是ranges.mk。 makefile將包含一組目標,例如a_1.txta_2.txt等,並將定義目標特定的變量,以定義啓動值和停止值。然後你可以-include生成的ranges.mk並make會重建它。你還沒有描述的一件事是當你想重新計算範圍:這是否真的取決於a.txt的內容?

反正是這樣的:

.PHONY: all 
all: 

ranges.mk: a.txt # really? why? 
     for i in 0 25 50 75; do \ 
      echo 'a_$$i.txt : RANGE_START := $$(($$i+1))'; \ 
      echo 'a_$$i.txt : RANGE_END := $$(($$i+25))'; \ 
      echo 'TARGETS += a_$$i.txt'; \ 
     done > [email protected] 

-include ranges.mk 

all: $(TARGETS) 
$(TARGETS) : a.txt # seems more likely 
     process --out [email protected] --in $< --start $(RANGE_START) --end $(RANGE_END) 

(或任何命令;你不給任何例子)。

+0

yes範圍將取決於a.txt的內容 – ndr 2015-03-31 16:18:18

+0

因此,當您更改'a.txt'時,它會重新生成範圍和輸出文件?好。無論如何,這是爲這種情況寫的。 – MadScientist 2015-03-31 16:20:07

+0

範圍將由處理a.txt中的信息的分箱算法生成,讓我測試這種方法,感謝您的信息! – ndr 2015-03-31 16:33:57