Ошибка: использование стека C 133776899 слишком близко к пределу при использовании copy_to из sparklyr

#r #dataframe #apache-spark #storage #sparklyr

#r #фрейм данных #apache-spark #Хранение #sparklyr

Вопрос:

Я пытаюсь преобразовать data.frame в Spark DataFrame :

 library(sparklyr)

conf <- list()

conf$`sparklyr.cores.local` <- 4
conf$`sparklyr.shell.driver-memory` <- "16G"
conf$spark.memory.fraction <- 0.9

sc <- spark_connect(master = "local", 
                    config = conf)

load("./data/dfm_training.RData")
load("./data/training.RData")


df <- training[,c(1,2,3,18)]
df$TextLength <- nchar(df$txt)
df <- df[df$TextLength > 0,]

df.tokens.df <- cbind(nchar = df$TextLength, label = df$training2_CFT,
                  convert(dfm_training, to = "data.frame"))

## to spark
sdf <- copy_to(sc, df.tokens.df)
  

Однако я получаю следующую ошибку:

Error: C stack usage 133776899 is too close to the limit

Я попытался переключить количество ядер и количество используемой памяти, но без изменений.

Комментарии:

1. Что вы испытываете, так это то, что copy_to каким-то образом выполняется рекурсивный вызов, добавляющий слишком много вызовов функций в стек. В предыдущем выпуске на github от 2016 года была аналогичная проблема. R в общем случае не допускает рекурсии по глубине. Однако возникает большой вопрос, почему это происходит при простом вызове copy_to . Это не сразу видно из вашего примера.

2. Я видел эту проблему, однако они ее не решают. Мой df.tokens.df имеет около 4 ГБ, как вы думаете, это может быть связано?

3. Честно? Нет. Я сам не могу понять причину в вашем конкретном примере, но если вы знакомы с отладкой, вы могли бы теоретически попробовать вызвать debug(sparklyr::copy_to) и посмотреть, сможете ли вы найти конкретный вызов, который вызывает переполнение стека. Если это отличается от проблемы, я бы предложил открыть новую проблему на их github, и если вы найдете решение, опубликуйте и ответьте как здесь, так и в их github.