3

我在 64 位 Windows 中使用 64 位 R。但是在运行以下语句时

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

R产生了一条错误消息说

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

这对 64 位 R 没有什么意义。有什么办法可以避免这种限制吗?

4

1 回答 1

2

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

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

这大致是我所做的。

  1. 删除 ff 函数中 ff 对象大小(长度)的所有错误检查整数
  2. 将大小和页面大小传递给 C 函数时,使用 as.double 而不是 as.integer new
  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 方法中,将所有 *_new 函数替换为 *_d_new 并使用 asReal 而不是 asInteger 来表示 len 和 pagesize

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

于 2013-07-26T14:16:47.033 回答