gpt4 book ai didi

r - fread 保护堆栈溢出错误

转载 作者:行者123 更新时间:2023-12-04 08:10:16 26 4
gpt4 key购买 nike

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

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

当我尝试读入文件时:

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 中修复。

  • An unintended 50,000 column limit has been removed in fread. Thanks to mpmorley for reporting. Test added.


原因是我在 fread.c 中弄错了这部分来源 :
// *********************************************************************
// 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);
}

根据 R-exts section 5.9.1 ,不需要循环内的 PROTECT :

In some cases it is necessary to keep better track of whether protection is really needed. Be particularly aware of situations where a large number of objects are generated. The pointer protection stack has a fixed size (default 10,000) and can become full. It is not a good idea then to just PROTECT everything in sight and UNPROTECT several thousand objects at the end. It will almost invariably be possible to either assign the objects as part of another object (which automatically protects them) or unprotect them immediately after use.



所以现在删除了 PROTECT,一切都很好。 (自该文本编写以来,指针保护堆栈限制似乎已减少到 50,000;Defn.h 包含 #define R_PPSSIZE 50000L 。)我已经检查了 data.table C 源中的所有其他 PROTECT 是否有类似的内容,并找到并修复了一个在assign.c 中也是(通过引用添加超过50,000 列时),没有其他。

感谢举报!

关于r - fread 保护堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18449997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com