Я пытаюсь читать в нескольких сотнях тысяч файлов JSON и в конечном итоге превращать их в объект dplyr. Но файлы JSON - это не просто синтаксический анализ ключа и требуют много предварительной обработки. Предварительная обработка кодируется и достаточно хороша для эффективности. Но проблема, с которой я сталкиваюсь, заключается в том, чтобы эффективно загружать каждую запись в один объект (data.table или dplyr object).
Это очень редкие данные, у меня будет более 2000 переменных, которые в большинстве случаев будут отсутствовать. У каждой записи будет, возможно, сотня переменных. Переменные будут комбинацией символов, логических и числовых, я знаю режим каждой переменной.
Я думал, что лучший способ избежать R-копирования объекта для каждого обновления (или добавления одной строки за раз) - это создать пустой фрейм данных и затем обновить определенные поля после их вытаскивания из файла JSON. Но делать это в кадре данных очень медленно, перемещение в таблицу данных или объект dplyr намного лучше, но все же надеясь сократить его до минут вместо часов. См. Мой пример ниже:
timeMe <- function() {
set.seed(1)
names = paste0("A", seq(1:1200))
# try with a data frame
# outdf <- data.frame(matrix(NA, nrow=100, ncol=1200, dimnames=list(NULL, names)))
# try with data table
outdf <- data.table(matrix(NA, nrow=100, ncol=1200, dimnames=list(NULL, names)))
for(i in seq(100)) {
# generate 100 columns (real data is in json)
sparse.cols <- sample(1200, 100)
# Each record is coming in as a list
# Each column is either a character, logical, or numeric
sparse.val <- lapply(sparse.cols, function(i) {
if(i < 401) { # logical
sample(c(TRUE, FALSE), 1)
} else if (i < 801) { # numeric
sample(seq(10), 1)
} else { # character
sample(LETTERS, 1)
}
}) # now we have a list with values to populate
names(sparse.val) <- paste0("A", sparse.cols)
# and here is the challenge and what takes a long time.
# want to assign the ith row and the named column with each value
for(x in names(sparse.val)) {
val=sparse.val[[x]]
# this is where the bottleneck is.
# for data frame
# outdf[i, x] <- val
# for data table
outdf[i, x:=val]
}
}
outdf
}
Я думал, что режим каждого столбца может быть установлен и reset с каждым обновлением, но я также пробовал это, предварительно задав каждый тип столбца, и это не помогло.
Для меня, запуск этого примера с data.frame(закомментированный выше) занимает около 22 секунд, преобразование в таблицу данных составляет 5 секунд. Я надеялся, что кто-то знает, что происходит под обложками, и может обеспечить более быстрый способ заполнения таблицы данных здесь.