Comments 4
Эликсир становится выразительнее Erlang за счет стандартных модулей параллелизации, кои от чего-то не были добавлены в OTP. Кто знает почему?
Объясните пожалуйста, в чем реализация из примеров в статье лучше/хуже реализации без использования эликсира?
К примеру так:
К примеру так:
import re
from collections import Counter
x = "CGGACTCGACAGATGTGAAGAACGACAATGTGAAGACTCGACACGACAGAGTGAAGAGAAGAGGAAACATTGTAA"
all = []
for i in range(0, 5):
z = x[i:]
for j in re.findall('.{5}', z):
all.append(j)
count_all = Counter(all).most_common()
for i in count_all:
if i[1] >= 4:
print i
С помощью GenStage вычисления параллелятся.
Честно говоря не очень силён в разных либах Python, но основные преимущества по сравнению с решением в лоб следующие:
Stream.chunk(subseq_len, 1)
— генератор. В памяти за раз будет только один кусок от всего генома, а не массив из всевозможных чанков. Если данных вx
много — к примеру терабайты — в наглую в опреативку не загрузишь.Flow.from_enumerable
— соответствеено тоже генератор, оборачивающий чанкFlow.flat_map(&find_sequences(&1, k_mer_len, times))
— выполняет лямбду параллельно на всех доступных ядрах. Если их к примеру 50, то генерируется 50 чанков и запускаются параллельно, результаты мапятся.
На самом деле это обыкновенный MapReduce, но статья написана так, что ничего не понятно. (Кстати, partition/1
как раз и делает reduce, но он здесь не нужен, потому что данные в финальном map не пересекаются)
В принципе, стоит прочитать по ссылке про Flow (если не лень), но если это сделать, тогда не понятно зачем статья нужна, т.к. по ссылке примеры повкуснее.
Кстати, почему у вас all — не set?
Sign up to leave a comment.
Elixir в биоинформатике