Я выполняю параллельную операцию, используя кластер SOCK с работниками на локальной машине. Если я ограничу набор, который я повторяю (в одном тесте, используя 70 вместо полных 135 задач), то все работает просто отлично. Если я иду на полный набор, я получаю ошибку «Ошибка в unserialize (socklist [[n]]): ошибка чтения из соединения».
Я разблокировал порт в брандмауэре Windows (как вход / выход), так и разрешил весь доступ для Rscript / R.
Это не может быть проблема тайм-аута, потому что тайм-аут сокета установлен на 365 дней.
Это не проблема для любой конкретной задачи, потому что я могу работать последовательно просто отлично (также работает нормально параллельно, если я разделю набор данных пополам и сделаю два отдельных параллельных запуска)
Лучшее, что я могу придумать, это то, что через сокеты передается слишком много данных. Кажется, не существует кластерного параметра для ограничения ограничений данных.
Я не знаю, как поступить. Кто-нибудь видел эту проблему раньше или может предложить исправить?
Вот код, который я использую для настройки кластера:
cluster = makeCluster( degreeOfParallelism , type = "SOCK" , outfile = "" )
registerDoSNOW( cluster )
Редактировать
Хотя эта проблема касается всего набора данных, время от времени она также отображается с уменьшенным набором данных. Это может указывать на то, что это не просто проблема с ограничением данных.
Редактировать 2
Я копнул немного глубже, и оказалось, что моя функция на самом деле имеет случайный компонент, который делает так, что иногда задача вызовет ошибку. Если я запускаю задачи последовательно, то в конце операции мне говорят, какая задача не удалась. Если я запускаю параллельно, то я получаю ошибку «unserialize». Я попытался обернуть код, который выполняется каждой задачей, в вызов tryCatch с ошибкой = function (e) {stop (e)}, но это также приводит к ошибке "unserialize". Я в замешательстве, потому что я думал, что снег обрабатывает ошибки, передавая их обратно мастеру?