Есть ли способ, чтобы ограничить количество процессов, запущенных Р
Я использую doMC
, который использует пакет multicore
. Случалось (несколько раз), что при отладке (в консоли) она шла боком и взрывалась вилкой.
Имеет ли R syscall setrlimit ()? В pyhton для этого я бы использовал ресурс .RLIMIT_NPROC
В идеале я хотел бы ограничить число запущенных R процессов числом
EDIT: OS is linux CentOS 6
2 ответа:
Должно быть несколько вариантов. Вот соответствующий раздел из записи расширений R, раздел 1.2.1.1
Packages are not standard-alone programs, and an R process could contain more than one OpenMP-enabled package as well as other components (for example, an optimized BLAS) making use of OpenMP. So careful consideration needs to be given to resource usage. OpenMP works with parallel regions, and for most implementations the default is to use as many threads as 'CPUs' for such regions. Parallel regions can be nested, although it is common to use only a single thread below the first level. The correctness of the detected number of 'CPUs' and the assumption that the R process is entitled to use them all are both dubious assumptions. The best way to limit resources is to limit the overall number of threads available to OpenMP in the R process: this can be done via environment variable 'OMP_THREAD_LIMIT', where implemented.(4) Alternatively, the number of threads per region can be limited by the environment variable 'OMP_NUM_THREADS' or API call 'omp_set_num_threads', or, better, for the regions in your code as part of their specification. E.g. R uses #pragma omp parallel for num_threads(nthreads) ... That way you only control your own code and not that of other OpenMP users.
Одним из моих любимых инструментов является пакет, управляющий этим: RhpcBLASctl. Вот его описание:
Контролируйте количество потоков на 'BLAS' (он же 'GotoBLAS', 'ACML' и "МКЛ"). и возможно контролировать количество потоков в 'OpenMP'. получить несколько логических ядер и физических ядер, если это возможно.
Ведь ты необходимо контролировать количество параллельных сеансов, а также Количество ядер BLAS, выделенных для каждого из параллельных потоков. Существует причина, по которой параллельный пакет имеет значение по умолчанию 2 потока на сеанс...
Все это должно быть в значительной степени независимым от вкуса Linux или Unix, которые вы используете. Ну, кроме того, что OS X конечно (еще бы !!) не дает вам OpenMP.
И самый внешний уровень, которым вы можете управлять от
doMC
и друзей.
Вы можете использовать
registerDoMC
(смотрите документ здесь)registerDoMC(cores=<some number>)
Другой вариант-использовать команду
ulimit
перед запуском скрипта R:ulimit -u <some number>
Чтобы ограничить число процессов, которые R сможет породить.
Если вы хотите ограничить общее число процессоров, используемых несколькими R-процессами одновременно, вам нужно будет использовать cgroups или cpusets и присоединить R-процессы к cgroup или cpuset. Затем они будут ограничены физическими процессорами, определенными в группе или наборе процессоров. контрольные группы позволяют больше контролировать (например, также память), но более сложны в настройке.