This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-02-19
Channels
- # beginners (25)
- # boot (143)
- # braid-chat (9)
- # cider (18)
- # cljs-dev (88)
- # cljsrn (1)
- # clojure (91)
- # clojure-austin (2)
- # clojure-berlin (3)
- # clojure-japan (26)
- # clojure-russia (148)
- # clojurebridge (1)
- # clojured (29)
- # clojurescript (105)
- # cursive (7)
- # data-science (4)
- # datomic (15)
- # devcards (4)
- # emacs (8)
- # euroclojure (2)
- # events (1)
- # gsoc (27)
- # hoplon (3)
- # immutant (3)
- # ldnclj (3)
- # lein-figwheel (9)
- # leiningen (2)
- # luminus (1)
- # off-topic (5)
- # om (176)
- # onyx (136)
- # parinfer (16)
- # proton (13)
- # re-frame (33)
- # reagent (34)
- # spacemacs (1)
- # yada (127)
Ребята, а кто тут по data.xml зипперам сможет подсказать? Почему clojure версия в >3x медленее python версии вот этого скрипта: clojure - https://gist.github.com/rmuslimov/9fccefd7b5528234ed07 python - https://gist.github.com/rmuslimov/5e4a7fbc2bd892b3f104 clojure ~ 1.06 sec, python - 0.37sec
@rmuslimov: Хм, странно. Т.е. почти секнду занимает именно поиск :body :tag?
а если переписать использую чисто zip/down, zip/next и циклом? Быстрее будет? Ну чтоб понять что проблема именно в xm1->
а большой xml?
аа. Может связано тогда что кложура версия прочитывает весь файл в пямять, а питончик с хпатх - тока нужно
хз, теория
java -jar ../target/uberjar/logprocessor-0.1.0-SNAPSHOT-standalone.jar "Elapsed time: 1029.173557 msecs" "Elapsed time: 624.421729 msecs" "Elapsed time: 598.651636 msecs" "Elapsed time: 600.90551 msecs" "Elapsed time: 631.414071 msecs" "Elapsed time: 519.10315 msecs"
ну все равно дофега
там кода то на самом деле 20 строк, должно работать так же быстро
Ну попробуй да на чистых зипперах, без хелперов. Если так же медленно - то тогда проблема по крайней мере не в xml->
я использую зипперы счас много где, но до прода пока не дошло, поэтому не знаю про перформанс. Но когда в репле сижу то (я думал мне казалось) - иногда просиходили задержка на секунду может на простейших зиперах
или там хттп запросы были, чота не упомню уже
(defn get-xml-method-name2 [zipper] (-> zipper zip/down zip/right zip/down zip/down :tag))
ага, гуд, проблема не в макросе
а зиппер не ленивый случаем?
т.е. когда ты его не дергаешь, он и не делает ничо
(defn get-zipper [filename] (-> filename io/file io/input-stream xml/parse zip/xml-zip))
по типу можно взглянуть наверно, сча исходник посмотрю
хм, странно все это
в теории xpath будет работать быстрее зипперов, хотя не уверен на самом деле как она там работает, может через sax парсеры
может попрофайлеришь чтоб не гадать?
кто тут есть жмв опытом? какой профайлер можно поюзать?
а выложи пример хмл в тотже гист если можно
пока делать нечо с утра, поиграюсь
спасибо! Вы мне посоветуйте как профайл делать, я тоже завтра смогу с этим посидеть
вот тут друган посоветовал вот этот https://www.yourkit.com/
прикольно что я делаю один в один: парсю soap с помощью зипперов Но у меня CLJS на react-native, там вариантов не так много. А у тебя @rmuslimov какие причины? Для жавы же есть всякие wsdl генераторы?
пажди, не понимаю - как ты решаешь проблему namespaces? <SOAP-ENV:Body>
не будет находиться если юзаешь просто :Body же
опа, а не в этом ли причина? Зиппер не находит ноду и вынужден пройти весь хмл, неа?
точно?
а неа, отмена. Ты же грил что (-> zipper zip/down zip/right zip/down zip/down :tag))
тормозит ведь тоже
{:EndTransactionRQ :OTA_CancelRQ :ContextChangeRS :AddRemarkRS :SessionCloseRQ :OTA_HotelResRS :AddRemarkRQ :HotelPropertyDescriptionRS :ContextChangeRQ …..
> А у тебя @rmuslimov какие причины? Да, больше для интереса - хотел спарсить логи на AWS S3 и положить в ES
хм, странно - почему у меня не работало тада с неймспейсом…, хм, может руки кривые были
(defn get-xml-method-name2 [zipper] (-> zipper zip/down zip/right zip/down zip/down :tag))
@rmuslimov: твои замеры скорости довольно мало о чем говорят. используй https://github.com/hugoduncan/criterium для бенчей
Evaluation count : 60 in 60 samples of 1 calls. Execution time mean : 1.157558 sec Execution time std-deviation : 51.014212 ms Execution time lower quantile : 1.086369 sec ( 2.5%) Execution time upper quantile : 1.249452 sec (97.5%) Overhead used : 9.041528 ns
да неа, когда разница в 10 раз то тут можно и так понять что проблема не в том как бенчится
хотя может prepor и прав - бенчить тоже надо уметь, я походу не умею:
(time (run! (fn[_](-> (zipper))) (range 1000)))
;; 314ms
(time (run! (fn[_](-> (zipper) zip/down zip/right)) (range 1000)))
;; 312ms
> да неа, когда разница в 10 раз то тут можно и так понять что проблема не в том как бенчится то что разница будет — понятно. но что бы валидно сравнивать цифры, следить за прогрессом — нужно бенчить так. разница может быть в те же 10 раз после прогрева жита, в зависимости от кода
ну ага, @rmuslimov показывал что при убержаре вторые итерации уже на 40% быстрее
А кто знает как в итоге xpath работает? Там через SAX парсер? Я могу же дать 40ГБ хмл и xpath запрос и любая либа радостно вернет мне все результаты не сжирая 40гб оперативы
т.е. получается парсинг самого xml тормозит?
странно что тогда просто (defn get-xml-method-name3 [zipper] zipper) в 4 раза быстрее
аа, или парсинг xml ленивый и каждый раз когда ты дергаешь zip/down, etc. ты в итоге дергаешь clojure.xml?
Я xml толстенький обернутым saxon парсил и расковыривал. В clojure поддержка XML игрушечная и на конвертацию слишком много ресурсов надо. Можно наверно zippers поверх saxon сделать.
ну я строку к зипперу привожу как: (xml/parse (new org.xml.sax.InputSource (new java.io.StringReader xml-s)))
но он возвращает полносью распарсенный xml, т.е. тупо мапу
там зиппер не может тормозить в принципе - по мапе пробежаться ничо не стоит вообще
@rmuslimov: Попробуй отделить зипперы от создания xml в твоем бенче
ааа, я уже ничо не понимаю - создание зиппера из строки стокже занимает скок и пройтись по зипперу. Все, я не умею бенчить, сливаюсь
можно вот это прочитать http://blog.korny.info/2014/03/08/xml-for-fun-and-profit.html, так чувак в конце как раз дамп вики на 42 гига парсит зипперами и ессно все ленивое, может в ленивости ответ
оо, точняк, ускорил в 3 раза
lazy-parsing часть в этой статье
а неа, у тебя уже используется оно
я чойта наверно устал сегодня уже
>(macroexpand `(-> {:a 2} identity))
(clojure.core/identity {:a 2})
>(macroexpand `(-> {:a 2} (fn[a] a)))
IllegalArgumentException Parameter declaration {:a 2} should be a vector clojure.core/fn (core.clj:4375)
все, пора домой, репл устал или чо?
точно, еще пара скобок спасает
ну да ага, а еще такой вопрос: Как такое ((fn[x] {:a 22}) 22)
перевести в # синтаксис?
ближайшее что я смог это (#(identity {:a %}) 22)
покороче низя никак?
заместо identity? Дак на 2 длиннее даж
да, с параметром бы
тьфу, забыл задействовать)
ArityException Wrong number of args (0) passed to: PersistentArrayMap clojure.lang.AFn.throwArity (AFn.java:429)
да неа, мне не особо нужно - просто сделать анонимную функцию которая возвращает мапу можно использую либо fn синтаксис, либо с # но надо identity добавить
просто думал мож есть еще какие варианты
грусть печаль, петля и гроб
пойду пить
дак вот я тока что в репле прогнал
user=> (#({:a %}) 22) ArityException Wrong number of args (0) passed to: PersistentArrayMap clojure.lang.AFn.throwArity (AFn.java:429)
>(macroexpand `(#({:a %}) 22)) ((fn* [p1__4611__4612__auto__] ({:a p1__4611__4612__auto__})) 22)
(#(hash-map :a %) 22)
работает ага
((fn[x] {:a x}) 22) (#(hash-map :a %) 22) еще длиннее чем с fn
пойду пить все равно. Всех с пятницей
@michaelklishin Михаил, будешь гостем в clojure hangouts?