fread保护堆栈溢出错误

fread保护堆栈溢出错误,r,data.table,large-data,R,Data.table,Large Data,我在data.table(1.8.8,r3.0.1)中使用fread试图读取非常大的文件 有问题的文件有313行和约660万列数字数据行,文件大小约为12gb。这是一款Centos 6.4,内存512GB 当我尝试读取文件时: g=fread('final.results',header=T,sep=' ') 'header' changed by user from 'auto' to TRUE Error: protect(): protection stack overflow 我试着用

我在data.table(1.8.8,r3.0.1)中使用fread试图读取非常大的文件

有问题的文件有313行和约660万列数字数据行,文件大小约为12gb。这是一款Centos 6.4,内存512GB

当我尝试读取文件时:

g=fread('final.results',header=T,sep=' ')
'header' changed by user from 'auto' to TRUE
Error: protect(): protection stack overflow
我试着用--max-ppsize 500000启动R,这是最大值,但错误相同

我还尝试将堆栈大小设置为无限大小

ulimit -s unlimited
虚拟内存已设置为无限


我有这么大的文件是不是不切实际?我错过了一些非常明显的东西吗?

现在已在R-Forge上的v1.8.9中修复

  • fread
    中删除了意外的50000列限制。感谢莫利先生的报道。添加了测试
原因是我在来源中把这部分搞错了:

//*********************************************************************
//为已知nrow分配列
// *********************************************************************
ans=保护(allocVector(VECSXP,ncol));
protecti++;
setAttrib(ans、R_名称、符号、名称);

对于(i=0;i请尝试R-Forge上的v1.8.9(data.table主页上的链接)。那里有10个bug修复程序
fread
,请参阅新闻。大文件支持是其中之一,但在Windows上,Linux上应该已经可以了。660万列(!)是新的,很可能是一个新的错误。请用v1.8.9确认,我们将从那里开始…@MatthewDowle是的,我也不满意600万行。安装1.8.9,同样的错误。我制作了一个小得多的文件,10行x 50K列,同样的错误。10行x 49999列可以工作。你是指评论中的列(你写了600万行)?非常有趣和奇怪的是,它在50000列时失败了。做得很好,很快就完成了。我想不起任何这样的列限制。我会看一看。对不起,是的列。关于第一条评论的问题,我有512Gb的RAM,为什么“文件不适合?谢谢,对data.table.Apols做得很好,我读错了。出于某种原因,我读错了将512解释为MB,因为512GB RAM相当大!即使您编写了512GB。因此,是的当然应该读入良好。是否
read.table
/
read.csv
可以处理50k列和6e6列?使用313行和6536299列的文件进行测试。
system.time(geno@mpmorley太好了,感谢您的测试。考虑到12GB的文件如此之宽,15分钟读取一个文件听起来还可以。对您来说还可以吗?还有其他更快的方法吗?我想看看
verbose=TRUE
报告的时间细分。例如,如果大部分时间都花在mmap上,可能还有更多的选项可以调整。对我来说,这是可以接受的e、 我并不专注于用这些数据做一些有用的事情,我可能会看到一篇新的帖子。但是如果你和其他人感兴趣,我很高兴运行并发布。
// *********************************************************************
// Allocate columns for known nrow
// *********************************************************************
ans=PROTECT(allocVector(VECSXP,ncol));
protecti++;
setAttrib(ans,R_NamesSymbol,names);
for (i=0; i<ncol; i++) {
    thistype  = TypeSxp[ type[i] ];
    thiscol = PROTECT(allocVector(thistype,nrow));   // ** HERE **
    protecti++;
    if (type[i]==SXP_INT64)
        setAttrib(thiscol, R_ClassSymbol, ScalarString(mkChar("integer64")));
    SET_TRUELENGTH(thiscol, nrow);
    SET_VECTOR_ELT(ans,i,thiscol);
}