Мне нравится data.table, это быстро и интуитивно понятно, что может быть лучше? Увы, вот моя проблема: когда речь идет о data.table
в foreach()
цикле (с использованием doMC
реализации) я иногда получаю следующее сообщение об ошибке: Пример В ПРИЛОЖЕНИИПолучение случайной внутренней ошибки selfref в data.table для R
Error in { :
Internal error: .internal.selfref prot is not itself an extptr
Одной из раздражающих проблем здесь что я не могу заставить его воспроизводить с любой согласованностью, но это произойдет в течение некоторых длительных (несколько часов) задач, поэтому я хочу убедиться, что это никогда не произойдет, если это возможно.
Поскольку я имею в виду то же, data.table
DT
, в каждом цикле, я попытался запустить следующую строку в начале каждого цикла:
setattr(DT,".internal.selfref",NULL)
... удалить недопустимый/поврежденную собственного атрибута реф. Это работает, и внутренняя ошибка selfref больше не возникает. Однако это обходное решение.
Любые идеи для решения проблемы с корнем?
Большое спасибо за помощь!
Эрик
Приложение: Сокращенный R Информация Сессия подтверждающими последние версии:
R version 2.15.3 (2013-03-01)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
other attached packages:
[1] data.table_1.8.8 doMC_1.3.0
Пример с использованием смоделированного данных - вы, возможно, придется запустить history()
функцию много раз (как, сотни), чтобы получить ошибка:
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## Load packages and Prepare Data
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
require(data.table)
##this is the package we use for multicore
require(doMC)
##register n-2 of your machine's cores
registerDoMC(multicore:::detectCores()-2)
## Build simulated data
value.a <- runif(500,0,1)
value.b <- 1-value.a
value <- c(value.a,value.b)
answer.opt <- c(rep("a",500),rep("b",500))
answer.id <- rep(6000:6499 , 2)
question.id <- rep(sample(c(1001,1010,1041,1121,1124),500,replace=TRUE) ,2)
date <- rep((Sys.Date() - sample.int(150, size=500, replace=TRUE)) , 2)
user.id <- rep(sample(250:350, size=500, replace=TRUE) ,2)
condition <- substr(as.character(user.id),1,1)
condition[which(condition=="2")] <- "x"
condition[which(condition=="3")] <- "y"
##Put everything in a data.table
DT.full <- data.table(user.id = user.id,
answer.opt = answer.opt,
question.id = question.id,
date = date,
answer.id = answer.id,
condition = condition,
value = value)
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## Daily Aggregation Function
##
##a basic function that aggregates all the values from
##all users for every question on a given day:
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
each.day <- function(val.date){
DT <- DT.full[ date < val.date ]
#count the number of updates per user (for weighting)
setkey(DT, question.id, user.id)
DT <- DT[ DT[answer.opt=="a",length(value),by="question.id,user.id"] ]
setnames(DT, "V1", "freq")
#retain only the most recent value from each user on each question
setkey(DT, question.id, user.id, answer.id)
DT <- DT[ DT[ ,answer.id == max(answer.id), by="question.id,user.id", ][[3]] ]
#now get a weighted mean (with freq) of the value for each question
records <- lapply(unique(DT$question.id), function(q.id) {
DT <- DT[ question.id == q.id ]
probs <- DT[ ,weighted.mean(value,freq), by="answer.opt" ]
return(data.table(q.id = rep(q.id,nrow(probs)),
ans.opt = probs$answer.opt,
date = rep(val.date,nrow(probs)),
value = probs$V1))
})
return(do.call("rbind",records))
}
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## foreach History Function
##
##to aggregate accross many days quickly
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
history <- function(start, end){
#define a sequence of dates
date.seq <- seq(as.Date(start),as.Date(end),by="day")
#now run a foreach to get the history for each date
hist <- foreach(day = date.seq, .combine = "rbind") %dopar% {
#setattr(DT,".internal.selfref",NULL) #resolves occasional internal selfref error
each.day(val.date = day)
}
}
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
## Examples
##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
##aggregate only one day
each.day(val.date = "2012-12-13")
##generate a history
hist.example <- history (start = "2012-11-01", end = Sys.Date())
Вы можете вставить здесь свою реализацию цикла foreach (даже если она не может воспроизвести проблему, как вы говорите)? – Arun
Повторная попытка обхода, хорошая идея, но это 'setattr' не' setattrib'. Для правильного решения Арун на месте, он не должен быть надежно воспроизводимым, но если вы вставляете код, мы можем, вероятно, стресс проверить его правильно, чтобы он потерпел неудачу. –
И я вижу, что 'doMC' был обновлен до 1.3.0 22 февраля, а data.table до 1.8.8 на 6 марта. Пожалуйста, убедитесь, что вы предоставили номера версий всего, что вы используете спереди, например. 'SessionInfo()'. –