Как создать фрейм данных для сверхбольших векторов? ​

#r #dataframe #vector

#r #фрейм данных #вектор

Вопрос:

У меня есть 7 очень больших векторов, от c1 до c7. Моя задача — просто создать фрейм данных. Однако, когда я использую data.frame() , возвращается сообщение об ошибке.

 > newdaily <- data.frame(c1,c2,c3,c4,c5,c6,c7)
Error in if (mirn amp;amp; nrows[i] > 0L) { : 
  missing value where TRUE/FALSE needed
Calls: data.frame
In addition: Warning message:
In attributes(.Data) <- c(attributes(.Data), attrib) :
  NAs introduced by coercion to integer range
Execution halted
  

Все они имеют одинаковую длину (2 626 067 374 элемента), и я проверил, что там нет NA.

Я попытался установить в подмножество 1/5 каждого вектора, и data.frame() функция работает нормально. Итак, я предполагаю, что это как-то связано с длиной / размером данных? Есть идеи, как исправить эту проблему? Большое спасибо!!


Обновить как data.frame, так и data.table допускают векторы короче 2 ^ 31-1. По-прежнему не могу найти решение для создания одного сверхбольшого data.frame, поэтому вместо этого я подмножествую свои данные … надеюсь, что в будущем будут разрешены векторы большего размера.

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

1. Вы можете попробовать data.table . Кроме того, 2,6 миллиарда наблюдений довольно велики — вам, вероятно, потребуется более 32 ГБ оперативной памяти для хранения этого в рабочей памяти.

2. Вы можете рассмотреть специализированную платформу для обработки больших данных, такую как spark

Ответ №1:

R’s data.frames пока не поддерживает такие длинные векторы.

Ваши векторы длиннее 2 ^ 31 — 1 = 2147483647, что является наибольшим целочисленным значением, которое может быть представлено. Поскольку data.frame функция / класс предполагает, что количество строк может быть представлено целым числом, вы получаете сообщение об ошибке:

 x <- rep(1, 2626067374)
DF <- data.frame(x)
#Error in if (mirn amp;amp; nrows[i] > 0L) { : 
#  missing value where TRUE/FALSE needed
#In addition: Warning message:
#In attributes(.Data) <- c(attributes(.Data), attrib) :
#  NAs introduced by coercion to integer range
  

В принципе, что-то подобное происходит внутри:

 as.integer(length(x))
#[1] NA
#Warning message:
#  NAs introduced by coercion to integer range 
  

В результате if условие становится NA , и вы получаете ошибку.

Возможно, вместо этого вы могли бы использовать data.table пакет. К сожалению, у меня недостаточно оперативной памяти для тестирования:

 library(data.table)
DT <- data.table(x = rep(1, 2626067374))
#Error: cannot allocate vector of size 19.6 Gb
  

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

1. Я использовал data.table , но, похоже, он все еще не дает правильного ответа… пожалуйста, посмотрите мои правки

Ответ №2:

Для такого размера данных вы должны оптимизировать свою память, но как?

Вам нужно записать эти значения в файл.

    output_name = "output.csv"
   lines = paste(c1,c2,c3,c4,c5,c6,c7, collapse = ";")
   cat(lines, file = output_name , sep = "n")
  

Но, вероятно, вам также потребуется их проанализировать, и (как было сказано ранее) для этого требуется много памяти.

Итак, вам нужно прочитать файл по их строкам (например, 20 тысяч строк) итерацией, чтобы оптимизировать вашу оперативную память, проанализировать эти значения, сохранить их результаты и повторить..

     con = file(output_name )

    while(your_conditional) {
        lines_in_this_round = readLines(con, n = 20000)
        # create data.frame
        # analyse data
        # save result
        # update your_conditional
   }
  

Я надеюсь, это поможет вам.

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

1. Лучше использовать что-то вроде пакета ff или базы данных.

2. спасибо за вашу помощь, но, извините, я не понимаю, как вторая часть может привести к фрейму данных?

3. np, вторая часть посвящена разделению данных для оптимизации решения que, но это работает только в некоторых задачах.