Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
追加多个大数据表';s使用colClasses和fread进行自定义数据强制;命名管道_R_Append_Data.table_Fread - Fatal编程技术网

追加多个大数据表';s使用colClasses和fread进行自定义数据强制;命名管道

追加多个大数据表';s使用colClasses和fread进行自定义数据强制;命名管道,r,append,data.table,fread,R,Append,Data.table,Fread,[这是一篇文章中的多个bug报告/功能请求,但它们不一定独立存在。提前为怪物文章道歉。按照帮助(data.table)的建议在此处发布。此外,我是R新手;因此,如果我没有遵循下面代码中的最佳实践,请道歉。我正在尝试。] 1. rbindlist在6*8GB文件上崩溃(我有128GB的RAM) 首先,我想报告一下,使用rbindlist附加大数据.tables会导致R到segfault(ubuntu13.10,打包的R版本3.0.1-3ubuntu1,data.table是从CRAN中的R内部安装

[这是一篇文章中的多个bug报告/功能请求,但它们不一定独立存在。提前为怪物文章道歉。按照帮助(data.table)的建议在此处发布。此外,我是R新手;因此,如果我没有遵循下面代码中的最佳实践,请道歉。我正在尝试。]

1. <代码>rbindlist在6*8GB文件上崩溃(我有128GB的RAM) 首先,我想报告一下,使用rbindlist附加大数据.tables会导致R到segfault(ubuntu13.10,打包的R版本3.0.1-3ubuntu1,data.table是从CRAN中的R内部安装的)。该机器具有128 GiB的RAM;因此,考虑到数据的大小,我不应该耗尽内存

我的代码:

append.tables <- function(files) {
    moves.by.year <- lapply(files, fread)
    move <- rbindlist(moves.by.year)
    rm(moves.by.year)
    move[,week_end := as.Date(as.character(week_end), format="%Y%m%d")]
    return(move)
}
假设您在引擎盖下的内存效率要比不需要同时保存所有这些对象的情况下的内存效率高得多,这对于R的用户来说似乎是必要的

3.
colClasses
给出错误消息 我的第二个问题是,我需要为我的一种数据类型指定,但是失败了:

dt <- fread(tfile, colClasses=list(date="myDate"))
Error in fread(tfile, colClasses = list(date = "myDate")) : 
  Column name 'myDate' in colClasses not found in data
工作

然而,我有一个不同的用例,它是在从字符转换之前从一个数据列中去掉小数点。这里的精度非常重要(因此我们需要使用integer类型),从double类型强制转换为integer会导致精度损失

现在,我可以通过一些system()调用来附加文件,并通过一些sed魔术(此处简化)(其中tfile是另一个临时文件)传递它们:

无论如何,这有点像黑客

简化代码,如果我有我的愿望清单 理想情况下,我可以做这样的事情:

setClass("Int_Price")
setAs("character", "Int_Price",
    function (from) {
        return(as.integer(gsub("\\.", "", from)))
    }
)

dt <- fread(files, colClasses=list(price="Int_Price"))
setClass(“内部价格”)
setAs(“字符”、“整数价格”,
功能(来自){
返回值(作为.integer(gsub(“\\.”,“”,from)))
}
)
dt更新:rbindlist错误已在commit 1100中修复。新闻:
o修复了一个发生在>250m行上的罕见segfault(内存分配期间的整数溢出);关闭#5305。感谢Guenter J.Hitsch的报道


正如在评论中提到的,你应该分别提出不同的问题。但是,既然它们是如此好的点,并且在最后连接到了愿望中,那么好吧,我们将一步到位

1。rbindlist在6*8GB文件上崩溃(我有128GB的RAM)

请重新运行更改行:

moves.by.year <- lapply(files, fread)
正确的语法是

fread(tfile, colClasses=list(myDate="date"))
考虑到你在问题中所说的,iiuc,你实际上想要:

fread(tfile, colClasses=list(character="date"))  # just fread accepts list

其中任何一个都应该将名为“date”的列作为字符加载,以便您可以在强制之前对其进行操作。如果真的只是日期,那么我仍然需要自动实现强制。您提到了
numeric
的精度,只是想提醒一下
integer64
也可以由
fread
直接读取

4。fread认为命名管道是空文件


如果上一点得到解决,希望这一切都会消失
fread
通过内存映射其输入来工作。它可以接受非文件,如http地址和连接(tbc),为了方便起见,它首先要做的是将完整的输入写入ramdisk,以便可以从那里映射输入。fread
速度快的原因是首先看到整个输入。

太好了!感谢您花时间写下这些要点。如果你能把它们归档,那就更有用了。向下滚动以获取bug和功能请求的链接。关于bug,除非我们有一个可复制的例子,否则很难做任何事情。这些问题不太可能得到回答(甚至无法解决),因为这违反了SO政策。您应该将这些问题作为单独的功能请求(FRs)/bug进行归档,即使它们在您看来是集体的。。谢谢你的帮助。我应该注意到read.table/csv实际上接受colclass的列表。例如,传递colClasses=list(integer_var=“character”)就可以了。我不得不说,弗雷德对这种行为的偏离是令人惊讶的。@James谢谢,我会看一看<但是,code>colClasses=list(…)没有记录在
?read.csv
中。我的理解是,
colClasses
应该是一个字符向量。如果您正在传递一个
列表
,并且它正在工作,那么这是幸运的,并且不保证将来会工作(我假设它当前正在将列表转换为字符向量)。您是否看到
data.table
试图提供的
fread(,colClasses=list(character=150:200))
的优点?还有其他方法吗?我确实看到了宽数据只需指定每种类型一次的优势。也就是说,我尽量避免在固定宽度的数据中引用列号,因为新的列顺序可能会引入错误。也就是说,我只是对这种差异感到惊讶,并认为这是一个错误。但你是对的。现在我仔细看看read.table,它并没有完全记录我所看到的行为。也就是说,我更担心的是我不能为列指定自定义处理程序(请参阅我之前的评论)。这确实限制了我现在读取大型数据集的能力。
system(paste("tail -q -n+2", tfile2, paste(files, collapse=" "),
             " | sed 's/\\.//' >>", tfile), wait=FALSE)
move <- fread(tfile)
Error in fread(tfile) : File is empty: /tmp/RtmpbxNI1L/file78a678dc1999
setClass("Int_Price")
setAs("character", "Int_Price",
    function (from) {
        return(as.integer(gsub("\\.", "", from)))
    }
)

dt <- fread(files, colClasses=list(price="Int_Price"))
moves.by.year <- lapply(files, fread)
moves.by.year <- lapply(files, fread, verbose=TRUE)
fread(tfile, colClasses=list(date="myDate"))
Error in fread(tfile, colClasses = list(date = "myDate")) : 
    Column name 'myDate' in colClasses not found in data
fread(tfile, colClasses=list(myDate="date"))
fread(tfile, colClasses=list(character="date"))  # just fread accepts list
fread(tfile, colClasses=c("date"="character"))   # both read.csv and fread