Как создать фрейм данных для сверхбольших векторов? - PullRequest
0 голосов
/ 15 марта 2019

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

> newdaily <- data.frame(c1,c2,c3,c4,c5,c6,c7)
Error in if (mirn && 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, поэтому вместо этого я перенесу свои данные ... надеюсь, в будущем будут разрешены более крупные векторы.

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Для такого размера данных вы должны , чтобы оптимизировать вашу память, но как?

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

   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
   }

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

0 голосов
/ 15 марта 2019

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

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

x <- rep(1, 2626067374)
DF <- data.frame(x)
#Error in if (mirn && 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...