Все запланированные ядра столкнулись с ошибками в пользовательском коде (неожиданный символ), но такого кода нет

/ РЕДАКТИРОВАТЬ: Моя проблема была решена. Оказывается, это действительно была ошибка, не связанная с parallel.

Привет, сообщество StackOverflow,

сегодня у меня довольно странная проблема. У меня есть функция, которую я вызываю для запуска на 8 ядрах, и у нее есть параметр с именем type. Запуск с type = "points" работает отлично, но меня беспокоит запуск с type = "lines". Несмотря на то, что он следует почти тому же коду, в какой-то момент скрипт падает, и все, что я получаю (после почти 2 дней работы!):

Warning message: 
In mclapply(cluster_times, the_nt_function, all_trips, ellipses,  :
  all scheduled cores encountered errors in user code
Error: unexpected symbol in:
"
endtime"
Execution halted

Первое, что я проверил, это, конечно же, код the_nt_function. Я привожу краткое изложение кода ниже.

Важными здесь являются:

  1. Код для type = points работает отлично и дает ожидаемый результат.
  2. Код для строк типа = работает отлично в течение почти 2 дней, пока не появится ошибка, указанная выше.
  3. Указанная выше ошибка необъяснима: в приведенном ниже коде нет «конечного времени» или чего-либо еще!

the_nt_function принимает некоторые входные данные и для каждой строки в times_df создает своего рода образец dat. Если type="points", то подсчитывается либо количество (географических) точек в dat в объекте ell, используя st_intersection из sf. Если type="lines", он в основном делает то же самое, но вместо подсчета точек, пересекающихся с объектом ell, он подсчитывает линии, пересекающиеся с объектом ell.

Я позволил коду работать на высокопроизводительном кластере (но только с использованием 8 ядер). На моем компьютере он отлично работает на 7 ядрах, по крайней мере, для тестового набора из семи записей в объекте times_df. Он не падает, но дает ожидаемый результат.

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

У вас есть идеи, что эта ошибка хочет мне сказать?

/Редактировать: я вызываю функцию параллельно:

system.time(
    out <- mclapply(cluster_times, the_nt_function, all_trips, ellipses, TRUE, opts$type, mc.cores = cpus)
  )

где я привожу аргументы в правильном порядке.

the_nt_function <- function(times_df, dat, sf_object, type) {

  times_df$N_t = as.numeric(NA)
  
  # Here is code that performs some kind of preprocessing and filtering down data, basically creating
  # the data.table dat_filt_spc
    

    for every row in times_df {
      # do some more filtering and end up with a data table called dat_filt_time
      
      if(type == "points"){
      # Convert filtered DT to sf object (using startloc)
        suppressWarnings(
          dat_start_sf <- st_as_sf(
            as.data.frame(dat_filt_time),
            coords = c("startloclon", "startloclat"), 
            crs = 4326
          )
        )
      } else if(type == "lines") {
        suppressWarnings(
          dat_start_sf <- st_as_sf(
            as.data.frame(dat_filt_time),
            crs = 4326
            )
        )
      }
      
      # Intersect startlocs with ellipse
      suppressMessages(
        start_intersect <- st_intersection(dat_start_sf, ell)$tripid
      )
      
      # Convert filtered DT to sf object (using endloc) and filter out trips which are already intersected
      if(type == "points"){
        suppressWarnings(
          dat_end_sf <- st_as_sf(
            as.data.frame(dat_filt_time[!tripid %in% start_intersect]),
            coords = c("endloclon", "endloclat"), 
            crs = 4326
            )
        )
        # Intersect endlocs with ellipse
        suppressMessages(
          end_intersect <- st_intersection(dat_end_sf, ell)$tripid
        )
        # concatenate start and endloc intersections, assess Nt and add to times_df
        trips_intersect <- unique(c(start_intersect, end_intersect))
      } else if(type == "lines"){
        trips_intersect <- start_intersect
      }

      times_df[i, "N_t"] <- length(trips_intersect)
    }
    return(times_df)
  }
}

person Ben    schedule 11.12.2020    source источник
comment
Хорошей практикой здесь является запись вывода the_nt_function во внешний файл каждый раз, когда он выполняется, чтобы вы могли получить вывод итераций, которые не приводят к ошибке.   -  person qdread    schedule 11.12.2020
comment
на данный момент это приведет к ~ 38 000 отдельных файлов, но, возможно, стоит попробовать, спасибо!   -  person Ben    schedule 11.12.2020
comment
Какой именно код вы используете? То, что вы поделились, просто определяет функцию the_nt_function. Как ты это делаешь?   -  person MrFlick    schedule 11.12.2020
comment
Вы уверены, что это связано с mclapply()? Может быть, это также произойдет, если вы замените mclapply() на lapply()? Если это так, это намного проще устранить неполадки.   -  person HenrikB    schedule 11.12.2020
comment
@MrFlick: да, извините, это просто звонок Маклаппли. Я отредактирую свой вопрос! @HenrikB: tbh Я не совсем уверен, относится ли это к mclapply(), поскольку, если я запускаю его с mclapply, используя только часть данных, я не сталкиваюсь с ошибкой. Но тестировать это сейчас будет слишком долго, без параллелизма это не сделать в разумные сроки. Однако теперь я сохраняю отдельные файлы в качестве вывода функции (как предложил @qdreas), поэтому я надеюсь вскоре добраться до проблемных частей.   -  person Ben    schedule 12.12.2020