Народ, это нормально - столько памяти жрать?

59 views
Skip to first unread message

Close Screen

unread,
Dec 8, 2015, 4:56:29 AM12/8/15
to Clojure Russian
gzip размером 87 Mb, обработать построчно, разбить каждую строку на поля ({:key1 :value1 ...}) , профильтровать, и - после каждого прогона - плюс полтора гигабайта?

Думал запилю что-то на clojure, да вот устал с памятью бороться.


Вызываем (bash-c "zcat total.gz" :return :out-seq) - это возвращает lazy-seq

Оборачиваем в (eduction ...) все, вроде, как в учебниках, ... но это просто жесть какая-то.


Mikhail Kryshen

unread,
Dec 8, 2015, 11:07:15 AM12/8/15
to Clojure Russian
А сколько занимают несжатые данные?
После вызова (System/gc) память освобождается?

Можно попробовать ограничить максимальный размер кучи:
$ export _JAVA_OPTIONS=-Xmx512m

Тогда сборщик мусора будет работать более агрессивно и не позволит
занять больше указанного (это касается только кучи, где хранятся
объекты, а не всей занимаемой памяти). Если этой памяти действительно
недостаточно — вылетит OutOfMemoryError.

Можно еще в JVisualVM или с помощью встроенного профайлера
(см. man java) посмотреть, чем именно занимается память.
> --
> Вы получили это сообщение, поскольку подписаны на группу Clojure Russian.
>
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clojure-russi...@googlegroups.com.
> Настройки подписки и доставки писем: https://groups.google.com/d/optout.

--
М. А. Крышень
signature.asc

Eduard Bondarenko

unread,
Dec 8, 2015, 12:42:06 PM12/8/15
to clojure...@googlegroups.com
А просто sh не пробовали?
https://clojuredocs.org/clojure.java.shell/sh
> --
> Вы получили это сообщение, поскольку подписаны на группу "Clojure Russian".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес
> clojure-russi...@googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.

Eduard Bondarenko

unread,
Dec 8, 2015, 3:17:27 PM12/8/15
to clojure...@googlegroups.com
Ваш вариант у меня вообще не работает, висит используя 700% цпу, а
потом просто висит репл.
Зачем вы заворачиваете line-seq в lazy-seq если он уже и так ленивый?

Можно без шела вообще обойтись:

(defn run []
(with-open [f (-> "total.sql.gz" input-stream GZIPInputStream.)]
(->> f reader line-seq count)))

https://github.com/clojure-cookbook/clojure-cookbook/blob/master/04_local-io/4-21_read-write-gzip.asciidoc


2015-12-08 11:56 GMT+02:00 Close Screen <close....@gmail.com>:

Close Screen

unread,
Dec 8, 2015, 3:27:08 PM12/8/15
to Clojure Russian
Про system/gc не знал, попробую, спасибо.
Размер кучи ограничивал, вылетает иногда, непредсказуемо.
Думал, что нельзя out-seq как поле record присваивать, переписал как вызов метода,но ничего не изменилось. Про shell ,я когда-то смотрел, но насколько я помню, оно же блокирующее? Да и вообще, я более интеллектуальную обертку хотел написать, ссылку приводил выше.
Кто-нибудь вот попробуйте в репле запустить, на кложарс залито с именем late.system .версия.. Snapshot.

Close Screen

unread,
Dec 8, 2015, 3:33:48 PM12/8/15
to clojure...@googlegroups.com

Спасибо. В lazy-seq я заворачиваю, потому что первая строка в line-seq не ленивая, блокирует процесс.  С шеллом много завязано, без него будет неудобно.

Close Screen

unread,
Dec 8, 2015, 3:39:38 PM12/8/15
to Clojure Russian
Не, ну я, по крайней мере, понял, что так не должно быть. Где-то косяк у меня, видимо.

Eduard Bondarenko

unread,
Dec 8, 2015, 4:03:17 PM12/8/15
to clojure...@googlegroups.com
Если совсем упростить:

(defn run []
(let [rt (Runtime/getRuntime)
cmd (.exec rt "zcat total.sql.gz")
is (.getInputStream cmd)
iw (io/reader is)]
(count (line-seq iw))))

Будет
images.core> (doseq [_ (range 0 10)] (time (run)))
"Elapsed time: 36399.850425 msecs"
"Elapsed time: 36966.983332 msecs"
"Elapsed time: 36770.510386 msecs"
"Elapsed time: 37664.990132 msecs"
"Elapsed time: 36613.551963 msecs"
"Elapsed time: 37488.506581 msecs"
"Elapsed time: 36573.975606 msecs"
"Elapsed time: 36705.511801 msecs"
"Elapsed time: 37024.23245 msecs"
"Elapsed time: 36782.809412 msecs"

И память не растёт - около 1.5Гб как и в начале.

В консоли:
images % zcat total.sql.gz | time wc -l
16586135
wc -l 0.78s user 1.53s system 6% cpu 33.898 total

и

images % pigz -dc total.sql.gz | time wc -l
16586135
wc -l 0.62s user 1.29s system 12% cpu 14.708 total


2015-12-08 22:39 GMT+02:00 Close Screen <close....@gmail.com>:
> Не, ну я, по крайней мере, понял, что так не должно быть. Где-то косяк у меня, видимо.
>
Reply all
Reply to author
Forward
0 new messages