Ошибка нехватки памяти: попытка оптимизировать код поиска шаблона - PullRequest
0 голосов
/ 04 апреля 2019

Я написал следующую программу, которая рассматривает все возможные комбинации категорий, присутствующих в данных, и возможные способы их организации в определенный период времени, чтобы найти наиболее часто встречающиеся.

(Идея проистекает из этой статьи: https://www.nature.com/articles/s41598-018-34136-w).

Он работает правильно для небольших тестовых примеров, но как только я пытаюсь применить его к реальным данным, он «взрывается» во внешнююошибка памяти.

Я не лучший программист, но я попробовал все, что было в моих знаниях. Я пытался рассчитать каждый цикл, чтобы увидеть, будет ли понимание лучше. В конце концов, я былможет заставить программу работать на 30% быстрее, но этого все же недостаточно для реального анализа.

function ordered_combinations(data,L)
    return [collect(t) for t in collect(Iterators.product(fill(data,L)...))[:]]
end

Возвращает все возможные комбинации значений из данных общей длины L с разрешенным повторением.

function knapsack_solver(n,length)
    kombi = ordered_combinations(collect(1:length),n-1)
    return [k for k in kombi if sum(k)<length]
end

Находит все возможные комбинации из n чисел, идущих от 1 до длины, которые в сумме составляют сумму, меньшую длины.

Вот "главная"функция:

function pattern_definer(data, len, delays)
   kombinations = []
   for L in 2:len
        for k in ordered_combinations(unique(data),L)
            push!(kombinations,k)
        end
    end
    patterns = []
    for k in kombinations
        for d in knapsack_solver(length(k),delays)
            push!(patterns,(k,d))
        end
    end
    return patterns
end

Последняя вычисляет частоту появления каждого шаблона:

function relative_occurence(data,len,delay)
    patterns = pattern_definer(data, len, delay)
    occurence = []
    for p in patterns
        count = 0
        for i in 1:length(data)-delay
                if vcat(data[i],[data[i+delay] for delay in cumsum(p[2])]) == p[1]
                        count +=1
                end
        end
        push!(occurence,count)
    end
    return patterns,occurence
end
...