2015-10-26 3 views
0

Мне необходимо выполнить итерацию через набор значений для параметров A,B,C, чтобы создать таблицу результатов, которая поможет мне проанализировать важность таких параметров. Это для программы в R.Как эффективно выполнять итерацию через сложную функцию, которая выводит данные?

Допустим, что:

  1. A идет от rangeA = 1:10
  2. B идет от rangeB = 11:20
  3. C идет от rangeC = 21:30

Самый простой (не наиболее эффективное) решение, которое я сейчас использую, выглядит примерно так:

### here I create this empty dataframe because I add on each tmp calc later 
res <- data.frame() 

### here i just create a random dataframe for replicative purposes 
dataset <- data.frame(replicate(10,sample(0:1,1000,rep=TRUE))) 


ParameterAdjustment() <- function{ 

    for(a in rangeA){ 
    for(b in rangeB){ 
    for(c in rangeC){ 

    ### this is a complicated calculation that is much more 
    ### difficult than the replicable example below 
    tmp <- CalculateSomething(dataset,a,b,c) 

    ### an example calculation 
    ### EDIT NEW EXAMPLE CALCULATION 
    tmp <- colMeans(dataset+a*b*c) 
    tmp <- data.frame(data.frame(t(tmp),sd(tmp)) 

    res <- rbind(res,tmp) 
    } 
    } 
    } 

return(res) 
} 

Моя проблема заключается в том, что это отлично работает с моим исходным набором данных, который выполняет вычисления на 7000x500 фрейм данных. Однако мои новые наборы данных намного больше, и производительность стала важной проблемой. Может ли кто-нибудь предложить или помочь с более эффективным решением? Спасибо.

+1

Я думаю, что вам нужно предоставить более реалистичный пример 'CalculateSomething'. В настоящее время это довольно тривиально, так как 'tmp' является скаляром. Хотя, TBH, ваш 'res <- rbind (res, tmp)' не предоставляет пару «ключ-значение», что означает, что как в настоящее время структурированное получение «оптимальных» значений a, b, c из 'res' кажется бесполезным болезненный. –

+2

Кроме того, было бы полезно предварительно выделить память для res и использовать 'res [k] <- tmp' вместо огромного количества вызовов для назначения и rbind –

+0

Я отредактировал пример расчета, чтобы сделать его более подходящим –

ответ

0

Не знаете, на каком языке вы упомянули выше, поэтому не уверены, насколько это уместно, но здесь идет: вы выводите/отправляете данные по ходу или собираете все результаты отображения в памяти, а затем выводите их все за один раз в конец? Когда я столкнулся с подобными проблемами с большими наборами данных, и этот подход несколько раз помог мне. Например, отправка 10000 точек данных обратно клиенту для графика, а не создание массива всех этих точек и отправка его, я выводю на экран после каждой точки, а затем освобождаю память. Это все еще занимает некоторое время, но это неизбежно. Важным является то, что он не падает.

+0

Я использую язык R. У меня, похоже, нет проблемы с сбоем. Это скорее проблема производительности. Мне не нужно графовать данные, мне просто нужно иметь данные, хранящиеся в переменной, чтобы я мог получить к ней доступ для дальнейших вычислений/манипуляций позже –

Смежные вопросы