2013-07-26 5 views
1

Мне нужно обработать большое количество файлов данных с помощью gnuplot для создания изображений, которые собираются в фильме. Поскольку процедура занимает много времени, я хотел бы создавать кадры параллельно, и небольшое сообщение должно время от времени печататься, чтобы информировать пользователя о ходе.Обертка Gnuplot для параллельной обработки

Я попробовал Makefile подход:

SOURCES=$(wildcard ./*.in) 
OBJECTS=$(SOURCES:.in=.out) 

all: $(OBJECTS) 

%.out: %.in 
    ./worker.sh $< [email protected] 

где worker.sh является:

gnuplot << EOF 
set some_gnuplot_options 
set output "$2" 
plot "$1" 
EOF 

Но:

  1. Я не могу печатать сообщения о прогрессе,
  2. I Would предпочитают одно файловое решение (мне не удалось получить содержимое worker.sh непосредственно в make-файле),
  3. Это решение представляет собой довольно много накладных расходов по отношению к одному скрипту gnuplot, в котором содержатся все инструкции.

Возможно, окончательное решение было бы иметь хороший интерфейс C++ для gnuplot, но я не очень хорошо знаю существующие, и я не уверен, как это сделать. Любая другая идея? Пожалуйста, избегайте появления новых или не столь распространенных программ, таких как GNU, поскольку я не могу их использовать на некоторых машинах, которые я использую.

+0

Если ваша причина не иметь GNU Параллельно на вашем компьютере не распространяется http://oletange.blogspot.dk/2013/04/why-not-install-gnu-parallel.html, можете ли вы быть любезны, чтобы уточнить причина? –

+0

Потому что мне не разрешено устанавливать программное обеспечение. И я хотел бы свести к минимуму количество сценариев, которые будут переноситься, особенно в 3-й части. И я не думаю, что это может привести к повышению производительности в отношении makefile (все равно приходится загружать gnuplot каждый раз) И, наконец, я не очень хорошо это знаю. – DarioP

ответ

1

Из вашего комментария это звучит так, как будто вам разрешено использовать ваши собственные скрипты. GNU Parallel можно использовать в качестве сценария и не должен быть установлен, а затем вы можете создать файл parallel_plotter:

#!/home/tange/bin/parallel --shebang-wrap -v A={} /usr/bin/gnuplot 

name=system("echo $A") 
set term png 
set output name.".png" 
plot sin(x*name)/x 

замещающих/дом/Танга/bin/параллельно полный путем туда, где вы поместите скрипт параллельный.

Тогда:

chmod 755 parallel_plotter 
./parallel_plotter 1 2 3 4 5 

Это будет печатать строку для каждого завершенного прогона.


Чтобы избежать полный путь к/дома/Танге/бен/параллельно я могу придумать с этим решением:

#!/usr/bin/env gnuplot 

name=system("echo $A") 
set term png 
set output name.".png" 
plot sin(x*name)/x 

Тогда:

chmod 755 parallel_plotter 
parallel -v A={} ./parallel_plotter ::: 1 2 3 4 5 

Вы беспокоился о том, что нерест gnuplot даст много накладных расходов. Я проверил вышеуказанное:

./parallel_plotter {1..1000} 

Это заняло 10 секунд. Таким образом, накладные расходы на запуск gnuplot на моей системе составляют менее 100 мс на одно задание.

+0

Хорошо, спасибо этому решению. Я не хочу включать полный путь к скрипту, так как в принципе мне придется распространять его с остальной частью кода и кто знает, в какой папке он закончится? – DarioP

+0

Я понимаю ваше нежелание, и мне жаль, что у меня не было пути/home/tange/bin/parallel, не указав полный путь. К сожалению, трюк для использования «env» в этом случае не работает (#!/Usr/bin/env parallel). Поэтому, если вы найдете способ избежать полного пути к параллели в строке #!, Я буду очень рад узнать об этом. –

Смежные вопросы