/ РЕДАКТИРОВАТЬ: Моя проблема была решена. Оказывается, это действительно была ошибка, не связанная с 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
. Я привожу краткое изложение кода ниже.
Важными здесь являются:
- Код для type = points работает отлично и дает ожидаемый результат.
- Код для строк типа = работает отлично в течение почти 2 дней, пока не появится ошибка, указанная выше.
- Указанная выше ошибка необъяснима: в приведенном ниже коде нет «конечного времени» или чего-либо еще!
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)
}
}
the_nt_function
во внешний файл каждый раз, когда он выполняется, чтобы вы могли получить вывод итераций, которые не приводят к ошибке. - person qdread   schedule 11.12.2020the_nt_function
. Как ты это делаешь? - person MrFlick   schedule 11.12.2020mclapply()
? Может быть, это также произойдет, если вы заменитеmclapply()
наlapply()
? Если это так, это намного проще устранить неполадки. - person HenrikB   schedule 11.12.2020mclapply()
, поскольку, если я запускаю его сmclapply
, используя только часть данных, я не сталкиваюсь с ошибкой. Но тестировать это сейчас будет слишком долго, без параллелизма это не сделать в разумные сроки. Однако теперь я сохраняю отдельные файлы в качестве вывода функции (как предложил @qdreas), поэтому я надеюсь вскоре добраться до проблемных частей. - person Ben   schedule 12.12.2020