我有一个非常大的矩阵我试图在具有足够内存的服务器上运行glmnet。它甚至在非常大的数据集上工作到一定程度,之后我得到以下错误:
Error in elnet(x, ...) : long vectors (argument 5) are not supported in .C
如果我理解正确,这是由R中的限制引起的,该限制不能包含任何长度超过INT_MAX的向量。那是对的吗?有没有可用的解决方案,不需要完全重写glmnet?任何替代R解释器(Riposte等)是否解决了这个限制?
谢谢!
答案 0 :(得分:7)
由于版本3 R支持长向量。长矢量由double
索引。只要每个维度足够小以便integer
可索引,长向量就可以是矩阵或多维2维数组的基础。长矢量无法通过.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,将无济于事。
答案 1 :(得分:2)
elnet
中有一条说明:
但是,编译代码通常需要进行大量更改。注意 .C和.Fortran接口不接受长向量,所以 必须使用.Call(或类似的)。
.Fortran
拨打.Call
电话。您必须修改函数以使用'\usr\bin\myprogram'
,可能通过调用FORTRAN代码的C包装器,并可能重写和编译相关的FORTRAN代码来处理长向量。