All streams
Search
Write a publication
Pull to refresh

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.

Articles