Я разработал скрипт, в котором обрабатывал два больших массива (оба по тысяче строк), «родительский» и «продуктовый».
Начальный набор данных выглядит примерно так:
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), чтобы оценить, есть ли элементы ‹= значение (mztol). Я сделал это с помощью внешней функции.
subfun<-function(x,y) abs(x-y)<=mztol
vsubfun<-Vectorize(subfun)
vlogres<-outer(tabdiff,mzdiff,vsubfun)
Здесь я получил вектор, каждый элемент которого является логической матрицей. Затем я преобразовал его в список:
listres<-alply(vlogres,3,.dims=T)
и поставил в доказательство только ИСТИННЫЕ элементы и подсчитал их:
result<-sapply(listres, function(x) table(x)["TRUE"])
Ну, дело в том, что скрипт работает нормально, если я разрабатываю только небольшие векторы родителей и продуктов, например:
parent<-sample(1:1000,150)
product<-sample(1:1500,500)
Если я рассматриваю большие, я получаю сообщение об ошибке «ошибка: исчерпана память (достигнут предел?)», когда он обрабатывает vlogres. Предположим, у меня есть рабочая станция с 16 ГБ оперативной памяти. Но все равно терпит неудачу.
Итак, как я могу оптимизировать этот сценарий, чтобы избежать сообщения об ошибке? Любой намек?