【问题标题】:Memory requirement using `fread()` for large column vector对大列向量使用“fread()”的内存要求
【发布时间】:2019-08-09 11:27:36
【问题描述】:

我有一个人类可读的文件,其中包含 10 亿个双精度数,全部写在一行(10 亿列)中。

文件本身只有8G左右,我正在使用

fread("filename.data", sep=" ", header=FALSE, data.table=TRUE, showProgress=TRUE)

将它们加载到 R 会话中。该脚本将始终被“杀死”,我从showProgress 获得的最多信息是

* 捕获 segfault * 地址 0x7efc7bed2010,导致 'memory not 映射'

我在过去使用相同的方法加载了更大的文件(原始大小),但可能是“矩阵形式”并且列更少。我猜 data.table 需要存储 10 亿个列名,这会消耗大量内存......这是正确的吗?

  1. 有没有办法将fread 直接插入行向量(而不是在读取后转置)?
  2. 这些数据是否可以挽救,或者我需要将其重写为行向量吗?

【问题讨论】:

  • 平台?在 Linux 上,将由空格分隔的数字行转换为一列是相当简单的
  • ?fread 中的任何内容都没有建议将单行读取为单列的方法。但正如 Severin 所建议的那样,使用 shell 命令将其重写为行向量应该很容易。 Here's a way to do it for Linux or OSXhere's a way with Powershell (Windows)。
  • 该死的..我打算这样做,但认为它会同样昂贵。我试试看,谢谢是的,在 Linux 上。
  • 不确定你的意思是什么“成本”——内存、时间或其他东西——但无论哪种方式都会非常便宜。
  • 确实如此。只有几秒钟。

标签: r data.table fread


【解决方案1】:

将单行读取为单列?

给你..

library(data.table)

#read using default separators
fread('v1,v2,v2,v3
this, is, a, test
of, fread,one,line')

#      v1    v2  v2   v3
# 1: this    is   a test
# 2:   of fread one line

#read one column per line/row
fread('v1,v2,v2,v3
this, is, a, test
      of, fread,one,line', sep = "", header = FALSE)

#                    V1
# 1:        v1,v2,v2,v3
# 2:  this, is, a, test
# 3: of, fread,one,line

【讨论】:

  • 对于数字数据,以下行很有用,并且将sep="" 传递给fread 比读取长行向量更快:as.data.frame(sapply(seq(nrow(nos)), function(x) as.numeric(strsplit(data[x,], ' ')[[1]])))
猜你喜欢
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2018-01-09
  • 2015-04-12
相关资源
最近更新 更多