首页 文章

错误:由于外部功能,内存耗尽(限制达到?)

提问于
浏览
0

我开发了一个脚本,我处理了两个大型数组(数千行),“父”和“产品”

起始数据集是这样的:

parent<-sample(1:10000,3500)
product<-sample(1:7500,2500)
mztol<-0.0015
mzdiff<-sample(1:1000,31)
names(mzdiff)<-c("d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9",
             "d10", "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", 
             "d19", "d20", "d21", "d22", "d23", "d24", "d25", 
             "d26","d27,"d28", "d29", "d30",
             "d31")

首先,我应用外部函数,以便逐个元素地获得两个数组之间差异的矩阵 .

tabdiff<-outer(product,parent,'-')

然后我尝试用向量(mzdiff)逐元素地删除矩阵tabdiff,以便评估是否存在元素<= a value(mztol) . 我是通过外部功能做到的 .

subfun<-function(x,y) abs(x-y)<=mztol
vsubfun<-Vectorize(subfun)
vlogres<-outer(tabdiff,mzdiff,vsubfun)

在这里,我得到了一个向量,每个元素都是一个逻辑矩阵 . 然后我把它转换成一个列表:

listres<-alply(vlogres,3,.dims=T)

并只提供TRUE元素并计算它们:

result<-sapply(listres, function(x) table(x)["TRUE"])

好吧,关键是如果我只详细说明小的父级和产品向量,脚本工作正常,例如:

parent<-sample(1:1000,150)
product<-sample(1:1500,500)

如果我考虑大的那些,我在处理vlogres时收到错误消息“错误:内存耗尽(达到限制?)” . 考虑我有一个16 Gb RAM工作站 . 但无论如何它都失败了 .

那么如何优化此脚本以避免错误消息?任何提示?

1 回答

  • 0

    我能想到的最简单的解决方案是迭代 tabdiff 作为1d向量

    tabdiff<-c(outer(product, parent, '-'))
    result <- sapply(tabdiff, function(i) sum(abs(i-mzdiff) <= mztol))
    

    sapply 语句应该执行你想要的,但你应该仔细检查它 . 这消除了保存 m * n * p 大小数据的任务 .


    另一个想法是向后看你的问题 . 您希望 product - parent 值在每个 mzdiff 的容差阈值( mztol )内 . 这意味着您需要 product - parent 范围内的 product - parent 值 . 您可以为每个mzdiff生成上限和下限值的向量,并使用 dplyr::between 或更快的 data.table::inrange 来查找哪些值在范围内 .

相关问题