Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R矢量大小限制:“0”;.C”中不支持长向量(参数5);_R_Vector_Bigdata_Scalability_Glmnet - Fatal编程技术网

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

R矢量大小限制:“0”;.C”中不支持长向量(参数5);,r,vector,bigdata,scalability,glmnet,R,Vector,Bigdata,Scalability,Glmnet,我有一个非常大的矩阵,我试图在内存充足的服务器上运行glmnet。即使在某一点上非常大的数据集上,它也可以正常工作,之后我会得到以下错误: Error in elnet(x, ...) : long vectors (argument 5) are not supported in .C 如果我理解正确的话,这是由R中的限制引起的,R中不能有任何长度大于INT_MAX的向量。对吗?是否有任何可用的解决方案不需要完全重写glmnet?有没有其他口译员(还击等)解决了这一限制 谢谢 因为版本3R支

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

Error in elnet(x, ...) : long vectors (argument 5) are not supported in .C
如果我理解正确的话,这是由R中的限制引起的,R中不能有任何长度大于INT_MAX的向量。对吗?是否有任何可用的解决方案不需要完全重写glmnet?有没有其他口译员(还击等)解决了这一限制


谢谢

因为版本3R支持长向量。长向量由
double
索引。长向量可以是矩阵或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子集的实验性实现,如还击,将不会有帮助。

?“长向量”
中有一条注释,其中指出:

然而,编译后的代码通常需要相当广泛的更改。注 .C和.Fortran接口不接受长向量 .必须使用Call(或类似)


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

在您的代码中,是否执行矩阵的子集设置?我可能错了,但是如果矩阵包含超过360亿个元素,就不能执行矩阵子集。在这种情况下,您必须将矩阵子集视为一个巨大的原子向量(事实上是这样的,因为矩阵只是一个具有维度属性的向量)。在我的代码中,我使用一个文件备份的bigmatrix来避免这些问题,但当我运行glmnet时,我必须将其作为一个R矩阵传递,如下所示:
theMatrix[,]
。嗨Danny。我的评论和这个问题并没有直接关系,但它会有所帮助。看看迈克尔·凯恩的pirls套餐-。Mb此解算器适用于长向量。问题实际上是glmnet中的底层设计,以及它对(实际上不推荐和不鼓励的
.C()
)接口的使用。迈克·凯恩仔细研究了这一点,认为皮尔斯确实应该提供一些东西。它当然更小/更年轻/测试不太好,所以YMMV.刚刚发现了另一个非常有前途的软件包-感谢您提供的信息,但一些深入研究似乎表明,从.C切换到.Call需要对底层Fortran代码进行重大更改。这正是我想要避免的。听起来似乎根本没有一个解决方案适合我的需要。我已经更新了我的回复。我认为难度取决于实际代码,因此使用该代码的人可以给出最佳答案。我的猜测是:在一两天的编程之后,你要么就完成了,要么就有了一个好的估计。当然,这不应该是一个完全重写。这似乎已经做到了!对我来说,关键是dotCall64包。直接使用.Call有点超出了我现在的时间和复杂性,但是使用dotCall64,我只需回复.Fortran调用并为输入变量添加一个数据类型列表。识别正确的数据类型需要一些时间,但并不太困难。记忆方面仍然存在一些问题,但我想我能解决这些问题。非常感谢托马斯!感谢您提供的信息,但一些深入研究似乎表明,从.C切换到.Call需要对底层Fortran代码进行重大更改。这正是我想要避免的。听起来可能没有一个解决方案能满足我的需要。不,如果底层代码与32位向量结合在一起,恐怕你会被卡住。