Nano Hash - криптовалюты, майнинг, программирование

Как запустить длительный параллельный процесс в R, который запускает R-скрипт?

У меня есть блестящее приложение, которое собирает некоторые параметры от пользователей, которые затем будут использоваться для запуска симуляции, что занимает много времени ~ 1-3 дня. Итак, я хочу, чтобы у пользователя была возможность проверить, когда симуляция будет решена, а также предоставить возможность отправлять больше входных сценариев. Итак, я хочу создать подпроцесс для выполнения моделирования в фоновом режиме, пока работает мое блестящее приложение.

Я попробовал пакет «subprocess» и «processx», который позволяет создавать внешние процессы и взаимодействовать с ними. Однако я хочу иметь возможность запускать весь R-скрипт с порожденным процессом. то есть запустить source('simulation_script.R'). Кроме того, меня не волнует, не могу ли я поделиться какими-либо данными с моим родительским блестящим приложением. Я читаю входные данные из файлов и записываю выходные данные в файлы, которые затем можно показать блестящему пользователю приложения. Любые указатели для достижения этого были бы полезны?


  • См. r_bg() из библиотеки (callr), или если вы хотите реализовать это как будущее в блестящей библиотеке (future.callr) 26.07.2019
  • @ismirsehregal: это именно то, что я хочу, только все примеры рудиментарны и не показывают, как запустить R-скрипт. 26.07.2019
  • Ниже я привел простой пример. 29.07.2019

Ответы:


1

Чтобы использовать r_bg, просто оберните вызов source() функцией (которая должна быть автономной) следующим образом:

library(callr)

# create dummy script
writeLines('writeLines(as.character(Sys.time()), "myResult.csv")', 'myRScript.R')

# execute dummy script in background R process
r_bg(function(){source('myRScript.R')})

# read results
read.csv('myResult.csv')
29.07.2019

2

Если процесс вычислений занимает гораздо больше времени, чем ожидается, продлится интерактивный сеанс пользователя, вам следует разделить весь процесс на 3 части: ввод данных, вычисление, представление результата.

Сейчас на это есть несколько причин:

  1. Ваш пользователь, скорее всего, завершит свою блестящую сессию в течение 1-3 дней. Вы должны предвидеть, каким образом они смогут «повторно подключиться» к своим результатам.
  2. Если вы создаете подпроцесс из сеанса Shiny, будет ли он полностью независимым от своего родительского процесса? Что произойдет, если вы перезапустите сервер Shiny? Убивает ли он порожденный подпроцесс?
  3. Как вы справляетесь с несколькими пользователями? Если я, Джек и Боб запустим симуляции до обеда, ваш процесс Shiny будет использовать сервер Shiny плюс 3 симуляции. Роджер возвращается с обеда и пытается отправить свою симуляцию — достаточно ли ресурсов на сервере Shiny для обслуживания сеанса Shiny Роджера?

Итак, вы обрабатываете свою симуляцию в 3 частях:

  1. Приложение Shiny, которое принимает заказы пользователя и отправляет их в очередь.
  2. Очередь и вычислительная часть, которая работает независимо от двух других частей. Его единственная ответственность состоит в том, чтобы взять следующий заказ в очереди, пометить его как обрабатываемый, выполнить вычисления и, когда будет выполнено/при ошибках, пометить заказ как таковой и сохранить вывод.
  3. Приложение Shiny, которое может отображать вывод / результаты.

Часть очереди и вычислений в основном представляет собой базу данных (такую ​​же простую, как SQLite, MySQL или MS SQL, все, что у вас есть), если она поддерживает несколько процессов. Вычислительная часть представляет собой сценарий, который бесконечно зацикливается, запрашивает задачу и выполняет ее. Это позволяет масштабировать его (просто запуская несколько экземпляров скрипта), перемещать его на более мощные вычислительные узлы и т. д., не влияя на представление в приложениях Shiny.

29.07.2019
  • Любые предложения о том, какой язык использовать для кодирования вычислительной части (например, скрипт, который бесконечно зацикливается для поиска вставок БД)? Пример был бы очень полезен. 13.09.2019
  • Я реализовал систему очередей как на R, так и на Python, используя базу данных SQLite; вы также можете посмотреть виньетку для callr (cran.r-project.org/web/packages/callr/vignettes/), на который ссылается @ismirsehregal. То, как вы это реализовали, также зависит от того, есть ли у вас один компьютер для выполнения вычислений или сетка рабочих процессов, которым вы можете передавать задания. 13.09.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..