当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《R向量大小限制:.C中不支持"长向量(参数5)"》经验,为你挑选了1个好方法。

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

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

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

谢谢!



1> Tomas Kalibe..:

由于版本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,将无济于事.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有