我有一个非常大的矩阵我试图在具有足够内存的服务器上运行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维数组的基础,只要每个维度足够小以便可以通过a进行索引integer
.长矢量不能通过.C
和传递给本机代码.Fortran
.您获得的错误消息是因为传递了长向量.C
.
长矢量可以通过.Call
.因此,只要glmnet的本机代码可以支持长向量(64位索引)或者可以修改/编译以支持它,就只需要修改R和glmnet的本机代码之间的接口.您可以在C中手动执行此操作,并且还有一个dotCall64
为此任务命名的新程序包.修改接口的一部分是决定何时复制参数 - .C/.Fortran预防性复制,但您不希望不必要地使用大型数据结构.
我认为更改glmnet的本机代码以支持64位索引的难度取决于实际代码(我只看了但从未使用过).很容易将Fortran代码中的所有整数(或显式或隐式32位整数)切换为64位.当某些整数必须保持32位时会出现问题,例如对于从R代码传递到R代码的整数向量会发生这种情况,因为R使用32位整数(即使在长向量中也是如此).在glmnet中传递了这样的整数向量.修改有多难取决于原始Fortran代码的清晰度(例如,如果它使用单独的整数变量来索引和访问整数数组的值等).
R的子集的实验性实现,如Riposte,将无济于事.