【问题标题】:How to create data frame for super large vectors? ​如何为超大向量创建数据框?​​​
【发布时间】:2019-08-06 13:39:03
【问题描述】:

我有 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.table。此外,26 亿个观测值相当大——您可能需要超过 32 GB 的 RAM 才能将其存储在工作内存中。
  • 可以考虑专门的大数据框架,比如spark

标签: r dataframe vector


【解决方案1】:

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 包。不幸的是,我没有足够的 RAM 来测试:

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

【讨论】:

  • 我使用了data.table,但它似乎仍然没有给出正确的答案......请查看我的编辑
【解决方案2】:

对于这种数据大小,您必须优化内存,但如何优化?

您需要将这些值写入文件中。

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

但您可能还需要分析它们,并且(如前所述)它需要大量内存。

所以你必须通过迭代读取文件的行(比如 20k 行)来优化你的 RAM 内存,分析这些值,保存它们的结果并重复..

    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
   }

希望对你有帮助。

【讨论】:

  • 最好使用ff package 或数据库之类的东西。
  • 感谢您的帮助,但抱歉我不明白第二部分如何导致数据框?
  • np,第二部分是关于拆分数据以优化解决方案,但它只适用于某些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2015-06-08
  • 1970-01-01
  • 2017-12-10
  • 2021-07-11
  • 2021-04-03
  • 1970-01-01
相关资源
最近更新 更多