R向量大小限制:.C中不支持“长向量(参数5)”

问题描述 投票:10回答:2

我有一个非常大的矩阵我试图在具有足够内存的服务器上运行glmnet。它甚至在非常大的数据集上工作到一定程度,之后我得到以下错误:

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

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

谢谢!

r vector bigdata scalability glmnet
2个回答
7
投票

由于版本3 R支持长向量。长矢量由double索引。长矢量可以是矩阵或多维2维数组的基础,只要每个维度足够小以便可以通过integer进行索引。长矢量不能通过.C.Fortran传递给本机代码。您获得的错误消息是因为通过.C传递了一个长向量。

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

我认为更改glmnet的本机代码以支持64位索引的难度取决于实际代码(我只看了但从未使用过)。很容易将Fortran代码中的所有整数(或显式或隐式32位整数)切换为64位。当某些整数必须保持32位时会出现问题,这种情况会发生,例如对于从/向R代码传递的整数向量,因为R使用32位整数(实际上甚至在长向量中)。在glmnet中传递了这样的整数向量。然后修改有多难取决于原始Fortran代码的干净程度(例如,如果它使用单独的整数变量来索引和访问整数数组的值等)。

R的子集的实验性实现,如Riposte,将无济于事。


2
投票

?"long vector"中有一条说明:

但是,编译代码通常需要进行大量更改。请注意,.C和.Fortran接口不接受长向量,因此必须使用.Call(或类似)。

elnet.Fortran电话。您必须修改函数以使用.Call,可能通过调用FORTRAN代码的C包装器,并可能重写和编译相关的FORTRAN代码来处理长向量。

© www.soinside.com 2019 - 2024. All rights reserved.