R не может обрабатывать тяжелые задачи в течение многих часов - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть список [~ 90 файлов] заархивированных файлов.Я написал цикл для их распаковки (примерно 1 ГБ на файл), выполнения некоторых вычислений, сохранения выходных данных для каждого из файлов и удаления разархивированного файла.Одна итерация этого процесса занимает около 30-60 минут на файл [не все файлы одинакового размера в точности].

Меня не слишком беспокоит время, так как я могу оставить его работать в выходные дни.Тем не менее, R не удается пройти весь путь.Я оставил его в пятницу вечером, и он работал всего 12 часов, поэтому он обработал только 30 из 90 файлов.

Я не часто сталкиваюсь с этим типом тяжелых процессов, но то же самое происходило в прошлом с аналогичными процессами.Нужно ли вводить какие-либо команды в свои циклы, чтобы компьютер не зависал при таких интенсивных процессах?Я попытался gc() в конце цикла, но безрезультатно.

Есть ли список рекомендаций «хорошей практики» для процедур такого типа?

Ответы [ 2 ]

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

Учитывая, как мало информации вы предоставили, трудно сказать, в чем на самом деле заключается проблема.

Если возможно, я сначала разархивирую и объединю файлы.Затем предварительно обработайте данные и удалите все поля, которые не требуются для анализа.Полученный файл будет затем использоваться в качестве входных данных для R.

Также следует помнить, что синтаксический анализ входных строк, например, временных меток, может занять довольно много времени.

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

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

Независимо отВот несколько советов или идей, которые вы можете реализовать:

  • Написание кода для обработки файла в виде отдельного случая, например, функции типа process_gz_folder().Затем зациклите пути к файлам и вызывайте функцию, которую вы каждый раз создавали, это поддерживает чистоту глобальной среды.
  • Как вы уже пытались, иногда gc() может помочь, но это зависит от ситуации и от того, является ли памятьочищается (например, после запуска rm()).Может использоваться после вызова функции в первой точке.
  • Сохраняете ли вы результаты каждой папки в памяти?Увеличивается ли этот набор результатов с каждой итерацией?В таком случае это может занимать необходимую память - сохранение результатов на диске в подходящем формате позволит вам накапливать результаты после обработки каждого из них.
  • Чтобы добавить к предыдущему пункту, если файлы выдают выходные данные, убедившись, чтоих имена являются подходящими и даже добавляют метку времени (например, inputfile_results_YYYYMMDD).
  • Код может проверить, если файл уже обработан и перейти к следующему, это может помочь перезапустить с нуля, особенно если ваш метод для проверки, если файлобрабатываются с использованием существования выходных данных (с отметкой времени!).
  • Использование try(), чтобы убедиться, что сбои не останавливают будущие итерации - однако это должно выдавать предупреждения / выходные данные, чтобы уведомить о сбое, чтобы вы могливернемся к более позднему моменту.
  • Абстрактный подход может состоять в том, чтобы создать один сценарий, который обрабатывает один файл, он может просто включать функцию из первой точки, продолжить с setTimeLimit() и предоставить время длякоторый, если файл не обработан, код перестану бегать .Выполните итерацию по этому сценарию с помощью сценария bash, вызывающего указанный сценарий R с Rscript, которому можно передавать аргументы (например, пути к файлам).Этот подход может помочь избежать зависаний, но зависит от того, знаете ли вы и устанавливаете ли вы приемлемое время.
  • Определите, не слишком ли большие файлы для памяти, при обработке кода, возможно, потребуется скорректировать, чтобы повысить эффективность использования памяти, или изменить код наобрабатывать данные постепенно, чтобы не допустить исчерпания памяти.
  • Сократить другие задачи на компьютере, которые могут потреблять ресурсы, которые могут вызвать зависание.

Это всего лишь некоторые идеи, которые возникаютИмейте в виду, что это может быть что-то, что следует учитывать в вашем примере (учитывая предоставленную информацию).Это поможет увидеть некоторый код и понять, какую обработку вы выполняете для каждого файла.

...