У меня проблема, когда я ищу числа с определенными свойствами в очень большом пространстве поиска (возможно, бесконечном, но определенно слишком большом, чтобы все пространство поместилось в памяти). Поэтому мне нужна ленивая последовательность, которую я фильтрую. Мой наивный подход заключался в использовании понимания списка (for
) для всего поиска, но при этом поиск выполняется в одном потоке. Есть несколько действительно простых способов сократить пространство поиска, а также есть некоторые части поиска, которые требуют больших вычислительных ресурсов.
Мой чуть менее наивный подход заключался в том, чтобы добавить простое сокращение в выражение for
и сделать функцию search
, которая выполняет более тяжелую работу. Затем: (filter search (for [..... :when (prune)]))
. В библиотеке редукторов есть функция filter
, но она не работает с ленивыми последовательностями. Я не могу преобразовать из ленивого seq из-за ограничений памяти.
Итак, как лучше всего отфильтровать ленивую последовательность параллельно? Мой последний наивный подход был бы похож на вставку последовательности в атом:
(defn accessor-gen [lazys]
(let [s (atom [nil lazys])]
(fn []
(first (swap! s (fn [[_ s]] [(first s) (rest s)]))))))
Тогда я мог бы иметь пул потоков из шести или около того, используя эту функцию для поиска в пространстве.
Вопрос: у меня неприятное ощущение, что я делаю это сложнее, чем нужно. Кроме того, меня беспокоит спор по поводу атома. Есть ли более простой способ использовать ленивую последовательность параллельно? Наконец, является ли весь мой подход в корне ошибочным? Есть ли способ лучше, возможно, тот, который не требует ленивых последовательностей?
pmap
. Я хочу отфильтровать свои данные, но нетpfilter
. Я знаю, как построить решение на основе основных концепций, которые мне известны, но боюсь, что я слишком усложняю его. Хотя, похоже, это достаточно обычная задача. - person galdre   schedule 13.10.2014