Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
foreach中的内存使用会一直增加,直到出现故障,但object.size()没有显示任何更改_R_Memory_Doparallel - Fatal编程技术网

foreach中的内存使用会一直增加,直到出现故障,但object.size()没有显示任何更改

foreach中的内存使用会一直增加,直到出现故障,但object.size()没有显示任何更改,r,memory,doparallel,R,Memory,Doparallel,我正在运行一个大型并行R函数,它包含一个for循环,将在每个内核上执行。该函数开始运行正常,但随着循环的进行,计算机的内存使用情况也会随之变化,直到最终耗尽RAM,进程失败。我不明白为什么会发生这种情况,因为循环既不创建也不增长对象,并且希望得到任何解决问题的指导 我在一个Linux系统(Ubuntu19.04)上工作,它有16个超线程CPU核和128GB的RAM。使用doParallel包,我创建了一个分叉集群,并使用foreach分发任务。在每个核心上循环的每次迭代中,我让每个从进程将其总内

我正在运行一个大型并行R函数,它包含一个for循环,将在每个内核上执行。该函数开始运行正常,但随着循环的进行,计算机的内存使用情况也会随之变化,直到最终耗尽RAM,进程失败。我不明白为什么会发生这种情况,因为循环既不创建也不增长对象,并且希望得到任何解决问题的指导

我在一个Linux系统(Ubuntu19.04)上工作,它有16个超线程CPU核和128GB的RAM。使用doParallel包,我创建了一个分叉集群,并使用foreach分发任务。在每个核心上循环的每次迭代中,我让每个从进程将其总内存使用量打印到控制台(使用pryr::mem_used())。我还让它打印出应用于本地环境中所有对象的object.size()命令的总和(使用environment()访问),以及应用于进程可见的全局环境中所有对象的object.size()命令的总和的相同数字

在开始调用foreach时,htop显示的内存使用总量(与终端分开调用)几乎是我预期的两倍。全球环境中有大约12GB的对象;我的31个逻辑内核中的每个都包含大约1GB的对象(根据object.size()的总和);但htop报告的内存使用量约为70GB。从每个内核调用mem_used()报告每个内核大约8.5 GB的内存使用量——我猜每个内核上大约有1 GB的对象,加上全局环境中内核可见的~7GB的对象

我在整个循环中定期调用gc(),当每个核心在循环中运行时,object_size()和mem_used()报告的内存使用量始终保持在相同的范围内。然而,htop报告的内存使用率随着时间的推移稳步增加,直到最终达到126 GB并崩溃

以下是调用foreach的要点:

library(doParallel)
num_cores <- detectCores() - 1
SimWrapper <- function(platform, cores) {
  if (platform != 'windows') {
    workers <- makeCluster(cores, type= 'FORK', outfile = '')
    registerDoParallel(workers)
    gc()
    return(foreach(x = 1:cores, .packages = c('data.table', 'broom', 'rlang', 'sn', 'zoo', 'stringr', 'pryr')) %dorng% SimTournament(x))
  }
}
out <- SimWrapper(.Platform$OS.type, cores = num_cores)
SimTournament <- function(core) {
  ThisCoreDTs <- get(paste0('Core', core, 'DTs'), pos = .GlobalEnv)
  list2env(setNames(ThisCoreDTs, paste0('ThisCore', names(ThisCoreDTs))), envir = environment())
  rm(ThisCoreDTs)
  gc()
}
# Initialize empty data.table of objects in local environment
ThisCoreMemUse <- data.table(Object = ls(environment()), Size = rep(NA_character_, length(ls(environment()))), SizeInMiB = rep(NA_real_,
length(ls(environment()))))

# Populate size of each object
for (i in 1:(nrow(ThisCoreMemUse))) {
  set(ThisCoreMemUse, i, 'Size', format(object.size(get(ThisCoreMemUse$Object[i])), units = 'MiB'))
}
ThisCoreMemUse[, SizeInMiB := as.numeric(gsub(' MiB', '', Size))]
setorder(ThisCoreMemUse, -SizeInMiB)

# Repeat for objects in global environment visible to slave process
GlobalEnvMemUse <- data.table(Object = ls(.GlobalEnv), Size = rep(NA_character_, length(ls(.GlobalEnv))), SizeInMiB = rep(NA_real_, length(ls(.GlobalEnv))))

for (i in 1:(nrow(GlobalEnvMemUse))) {
  set(GlobalEnvMemUse, i, 'Size', format(object.size(get(GlobalEnvMemUse$Object[i])), units = 'MiB'))
}
GlobalEnvMemUse[, SizeInMiB := as.numeric(gsub(' MiB', '', Size))]

# Calculate total reported memory usage for local and global environments, and combine into one data.table
ThisCoreMemUse <- rbindlist(list(data.table(Object = 'Total on core', Size = NA_character_, SizeInMiB = sum(ThisCoreMemUse$SizeInMiB)), data.table(Object = 'Visible in global env', Size = NA_character_, SizeInMiB = sum(GlobalEnvMemUse$SizeInMiB)), ThisCoreMemUse))

# Print results to console
print(paste0('Core number ', core, ' has total memory use of ', mem_used(), '. Its five largest objects are:'))
print(head(ThisCoreMemUse, 7))
Error in unserialize(socklist[[n]]) : error reading from connection
Calls: SimWrapper ... recvOneData -> recvOneData.SOCKcluster -> unserialize
Execution halted