Вот 1/10 из всего вашего 100.000 наборов данных, выполненных чуть более 1/10 секунды, на Clojure 1.2.1. Это в основном ваш код (который на самом деле не является истинным синтаксисом clojure, но мы получаем суть), но как-то работает на скорости 10.000x.
;generate 10.000 datasets of 100 maps having 10 fields each
(def scenario-data
(vec (repeatedly 10000
(fn [] (vec (repeatedly 100 (fn [] (zipmap
[:a :b :c :d :e :f :g :h :i :j]
(repeatedly (fn [] (str (- (rand-int 2000) 1000))))))))))))
;now map the datasets into the reduced sums of the parsed :b fields of each dataset
(time (doall (map (fn [dataset] (reduce (fn [acc mp] (+ acc (Integer/parseInt (:b mp)))) 0 dataset))
scenario-data)))
"Elapsed time: 120.43267 msecs"
=> (2248 -6383 7890 ...)
Поскольку этот сценарий является довольно большой объем памяти (10000 наборов данных ~ = 600MB, общий расчет использует ~ 4 Гб), я не могу запустить сценарий 100,000 набора данных на моей домашней машине. Тем не менее, я могу запустить его, если я не держу наборы данных в памяти, но карта более ленивой последовательность без проведения на его голову ..
(time (doall (map (fn [dataset] (reduce (fn [acc mp] (+ acc (Integer/parseInt (:b mp)))) 0 dataset))
(repeatedly 100000
(fn [] (repeatedly 100 (fn [] (zipmap
[:a :b :c :d :e :f :g :h :i :j]
(repeatedly (fn [] (str (- (rand-int 2000) 1000))))))))))))
"Elapsed time: 30242.371308 msecs"
=> (-4975 -843 1560 ...)
это 30 секунд для расчета вашего 100.000 версии набора данных и включает все время, необходимое для генерации данных. Использование pmap
сокращает это время примерно наполовину (4 ядра).
Редактировать: Создание полностью реализованных 100 000 наборов данных на машине с достаточной памятью занимает 135 секунд. Запуск кода суммирования по нему занимает ~ 1500 мс. Использование pmap
сокращает это до ~ 750 мс. A read-string
версия ~ 3.5x медленнее.
TL/DR: алгоритм, который вы опубликовали, можно запустить по сценарию 100 000 наборов данных за 1 секунду, учитывая достаточную память.
Пожалуйста, разместите свой полный код, в том числе о том, как вы читаете и сохраняете наборы данных в памяти, и убедитесь, что на этот раз как синтаксис, так и наблюдения являются точными. Вероятно, это скорее проблема памяти из-за того, что вы не читаете эти данные лениво из источника.
Пожалуйста, дайте настоящий код clojure вместо этого псевдокода. Мы можем это принять. – ivant
Это реальный код clojure ... – redhands
Почему бы не хранить int как int, а не строку? Производительность не приходит только из алгоритма, это комбинация структуры + алгоритм – Ankur