JulliaのTips
apt dist-upgrade したら、debian 10.4 になった。julia 1.4.1で動作させてます。
ちょいと面白い話題、 こんな楽しいBugも世の中にはある そうだ。
replの便利な使い方
edit
cookbook本のソースを見てたら、replからeditorを起動出来ると説明があった。使うeditorを環境変数に予め設定しておく。(ex. export EDITOR=emacs) lab.jlは前回の使い回し。
julia> edit(sore) julia> emacs: standard input is not a tty
起動する時、編集対象の関数を指定すればいいそうなんだけど、何故かエラー。 emacsが駄目なら、viが有るさってんで、対象をviに切り替えてみる。
julia> edit(sore) ;; viが起動してくれたんでちょいと編集 julia> include("lab.jl") ;; 編集内容が更新されないので、再読み込み [8, 13, 13, 13, 14, 15]
emacsをterminalの上で実行するには、色々な面倒が有るらしいので深いれはしない。尚、Xの動いている所では、ちゃんとemacsが別窓で開いて使えた。非常用として、 export JULIA_EDITOR=vi
としておくかな。
back scroll
helpで各種関数の説明を表示させるのはいいんだけど(特にExampleが参考になる)惜しいかな、画面が流れてしまい、先頭の方を見るのが面倒。みんなそう思っているだろうってんで、聞いてみた。julialang repl back scroll ぐらいの合言葉ね。
今から、教えてやるから、~/.julia/config/startup.jl にメモしとけ
# Usage @d collect ;; same as @doc collect | less more(content) = more(repr("text/plain", content)) # using Markdown # more(content::Markdown.MD) = more(Markdown.term(Core.CoreSTDOUT(), content)) function more(content::AbstractString) run(pipeline(`echo $(content)`, `less`)) return nothing end macro d(body) :(more(Core.@doc($(esc(body)))))
Unixなmanは、原稿を整形してmoreに渡してる。それのjulia版と言った所だね。 短い中にもマクロが出てきて、勉強になるなあ。
repl session to log
みんなログしちゃって、後で見る。
julia | tee LOGLOG
これでいいんだけど、
^[[0K^[[33m^[[1mhelp?> ^[[0m^[[0m ^[[7Ccollect ^[[14C ^[[?2004l^[[0msearch: collect
こんな具合に、一部お見苦しい点がございました。お詫び申し上げます。
julia --color=no | tee LOGLOG
色気無しに設定しても、強調モードが頑固に幅を利かせている。エスケープシーケンスを無視するツールが、何処かにあったかな。colコマンドを通すと大分ましにはなるんだけどね。
julia -e'using InteractiveUtils; apropos("take")' > /tmp/LOG
特定の物だけ狙ってログするなら、こんな一行野郎でもOk。
see content of Pkg
julia> Gnuplot. ;; .まで入力してTABを押すと、中の様子が伺える @gp __init__ gpvars save @gsp add_cmd gpversion savescript Dataset add_plot hist session_names :
スピードアップ
やっぱり、キャッシュに載っても、起動が遅い。
sakae@pen:/tmp$ time julia -e'using Gnuplot; exit()' real 0m8.422s user 0m2.838s sys 0m5.148s sakae@pen:/tmp$ time julia -e'using Gnuplot; exit()' real 0m3.170s user 0m3.163s sys 0m0.341s
PackageCompiler
を使って、 パッケージを取り込んだ物を作ってしまえば、起動は速くなるかな。
julia> using PackageCompiler julia> create_sysimage([:Gnuplot, :StatsBase], sysimage_path="withGnuplot.so") [ Info: PackageCompiler: creating system image object file, this might take a while...
目分量で約4分かかった。そして成果確認。
sakae@pen:/tmp$ time julia -J withGnuplot.so -e'using Gnuplot; exit()' real 0m2.150s user 0m0.943s sys 0m1.123s sakae@pen:/tmp$ time julia -J withGnuplot.so -e'using Gnuplot; exit()' real 0m0.210s user 0m0.135s sys 0m0.147s
これぐらいなら、耐えられるな。 簡単に呼び出せるように、ラッパーを作った。
sakae@pen:/usr/local/julia/bin$ cat pj #! /bin/sh julia -J /usr/local/julia/bin/withGnuplot.so "$@"
後は、常用してる、julia-repl.elの改変だな。switchが付いてて起動するjuliaを切り替えられるようになってたけど、デフォのjuliaをpjにした。
(defvar julia-repl-executable-records '((default "pj")) "List of Julia executables.
一応、emacs lab.jl して、お目当てのjuliaが起動してるかpsコマンドで確認。
2370 pts/1 S+ 0:00 emacs lab.jl 2379 pts/3 Ss+ 0:00 /bin/sh /usr/local/julia/bin/pj 2381 pts/3 Sl+ 0:08 julia -J /usr/local/julia/bin/withGnuplot.so 2393 pts/3 S+ 0:00 gnuplot 2426 pts/2 R+ 0:00 ps a
うん、ダイジョブだーーー。と、志村けん さんを偲んで!
use many cpu
packageCompilerを複数の石で動かしたらどうなる?
上記のwithGnuplot.soを作り出す2行を、スクリプトにして実験。2コアで4スレッド設定なVMwarePlayer上のdebian環境。
sakae@pen:/tmp$ time julia mkso.jl : real 4m6.106s user 3m27.529s sys 0m20.085s sakae@pen:/tmp$ time julia -p 2 mkso.jl : real 4m3.495s user 3m31.852s sys 0m13.767s
ほとんど関係無し。Topで見ていると、複数のjuliaが起動はしてるんだけどね。 マルチコア・マルチスレッドのCPUでも1コア・1スレッドしか使ってくれません。 甘くはないのね。 Juliaで超単純にマルチプロセス 騙されたと思って、やってみる?
memoryを沢山与える
CPU沢山作戦は失敗した。メモリーはどうか? オイラーみたいに仮想マシンで動かしているなら、ケチケチしないで仮想マシンにmemoryをふんだんに与えておこう。
上記のpackageCompiler負荷試験をやってた時、裏側でTopを起動して挙動を見てたんだ。時間が経過するにつれてjuliaのメモリー使用量がどんどん増えていき、1.7Gで頭打ちになった。そして、足りない分はswapがカバーするという挙動になって行った。
常日頃から、swapしたら負けよと心に決めていたんで、大ショック。最近のパソコンはdiskアクセスの音がしないんで、見落とす所だったわい。たった2行程のスクリプトで、こんなにメモリーを使うとはjuliaを甘く見ていたな。
ちなみに、debianに割り当てたメモリーは2Gだったんで、OS内が全部juliaで埋め尽くされていたわけね。
長丁場で動くプロセスは、メモリーハングリーになっていないか、点検すべし。とか書くと、アルゴリズムを工夫して、エコな生活をしろと言われそう。
自習用マニュアル
若しコロナに感染して、病院に収容されるとしたら、何持ってく?
オイラーならパソコン一台。何たって数種のUnixとそのソースが入っているんで、飽きる事は無いだろう。juliaのPDFも有るし。
でも、意外とこのPDFの使い勝手悪い。だって、印刷用の原稿だからね。普段から慣れ親しんだhtmlをWebで見たい。でも、病院までWiFiが来てるか?
何も心配は無い。juliaを入れているなら、既にhtmlは準備されてますから。
/usr/local/julia/share/doc/julia/html/en/index.html
を、一度firefoxなりから起動し、すかさずブックマークしておこう。次回からは簡単に俺様専用のページを開けるぞ。例えネットワークが死んでいてもだ。 なお、上記pathは、各自のインストール状況で異なるから、各自読み替えてね。
また、shere/juliaの下に、baseとstdlibのソース群が控えているから、見ると吉(かも)。
1から始める Juliaプログラミング こういう本も出たみたいだね。タケノコの季節がやってきて、python群落みたいになるのであろうか?