R 向量大小限制:"long vectors (argument 5) are not supported in .C"

R vector size limit: "long vectors (argument 5) are not supported in .C"

我有一个非常大的矩阵,我正试图 运行 在具有大量内存的服务器上通过 glmnet。即使在非常大的数据集上,它也能正常工作到某个点,之后我收到以下错误:

Error in elnet(x, ...) : long vectors (argument 5) are not supported in .C

如果我理解正确的话,这是由 R 中的限制引起的,R 中不能有任何长度超过 INT_MAX 的向量。那是对的吗?是否有不需要完全重写 glmnet 的可用解决方案?是否有任何替代 R 解释器(Riposte 等)解决了这个限制?

谢谢!

从版本 3 R 开始支持长向量。长向量由 double 索引。长向量可以作为矩阵或多于 2 维数组的基础,只要每个维度都小到足以被 integer 索引。不能通过 .C.Fortran 将长向量传递给本机代码。您收到的错误消息是因为通过 .C.

传递了一个长向量

可以通过 .Call 传递长向量。因此,只要 glmnet 的本机代码可以支持长向量(64 位索引)或者可以 modified/compiled 支持它,只需要修改 R 和 glmnet 的本机代码之间的接口。您可以在 C 中手动执行此操作,并且还有一个名为 dotCall64 的新包用于此任务。修改接口的一部分是决定何时复制参数 - .C/.Fortran 预防性复制,但您不希望对大型数据结构进行不必要的操作。

我认为更改 glmnet 的本机代码以支持 64 位索引的难度取决于实际代码(我只看过但从未使用过)。很容易将 Fortran 代码中的所有整数(或显式或隐式 32 位整数)切换为 64 位。当一些整数必须保持 32 位时,麻烦就来了,这会发生,例如对于传递 from/to R 代码的整数向量,因为 R 使用 32 位整数(即使在长向量中也是如此)。 glmnet中传递了这样的整数向量。那么修改的难易程度取决于原始 Fortran 代码的整洁程度(例如,如果它使用单独的整数变量来索引和访问整数数组的值等)。

R 子集的实验性实现(如 Riposte)无济于事。

?"long vector" 中有一条注释指出:

However, compiled code typically needs quite extensive changes. Note that the .C and .Fortran interfaces do not accept long vectors, so .Call (or similar) has to be used.

elnet 拨打了 .Fortran 次电话。您将不得不修改函数以使用 .Call,可能是通过调用 FORTRAN 代码的 C 包装器,并且可能重写和编译相关的 FORTRAN 代码以处理长向量。