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群落みたいになるのであろうか?

早わかり,すぐに使える Julia 1.0


This year's Index

Home