2013-07-25 61 views
3

我在64位Windows中使用64位R。但是,运行下面的语句时ff对象长度限制为64位Windows中的32位整数

fi <- ff(vmode="integer", length=2147483648) 

R上产生一个错误信息说

length must be between 1 and .Machine$integer.max

这没有良好的意识为64位R.有没有办法避免这种限制?

+1

看看你的(未指定的)64位版本R中的.Machine $ integer.max(它会一直是它的)。 R 3.0+确实允许更长的53位索引(数字尾数的长度),所以ff的作者可能还没有在代码中改变他们的测试。 –

+1

http://google-opensource.blogspot.ca/2011/11/bringing-64-bit-data-to-r.html –

+0

您使用的是哪个版本的R? > = R 3.0.0? –

回答

3

我通过更改/重新编译软件包的源代码解决了这个问题。

在ff的许多功能中,我只需要创建ff对象并调用get/set下标方法,因此我的范围足够狭窄,足以让我在一夜之间完成此操作,但所有功劳都归功于组织原作者源很好。实际上,作者为这个问题做好了准备,并为不同类型的索引和大小制作了C宏。我只是用C宏来做我想做的事。

这里大概是我做的。

  1. 传递的大小和页大小至C功能new当删除FF对象的尺寸为(长度)的所有错误检查整数在FF功能
  2. 使用as.double代替as.integer的。
  3. 在ff.h,我重新定义下面的宏和ff.cpp其相应部分

    #define FF_DECL_TYPE(NAME,TYPE) \ 
        FF_DECL_TYPE2(NAME,TYPE,int,int) \ 
        FF_DECL_TYPE2(NAME##_d,TYPE,double,double) 
    
  4. 在r_ff.c的r_ff_new方法

    ,带* _d_new替换所有* _new功能和使用asReal代替asInteger为LEN和PAGESIZE

我相信还有更多的事情要做,但在我最初的测试,我可以在我的问题执行上面的语句,并可能获取/设置R.我数组的任何元素对象是预处理和分析,例如,30 GB的数据立方体不离开R.我就这么接近。

+1

不错!如果将它包含在ff软件包中会很棒! – jwijffels

+0

@jwijffels虽然我的改变还没有完成,但我愿意为有机会做出贡献。一旦我完成(测试/调试)这个改变,我会尝试联系作者。 –