ls-R の必要性
まず、インストール時に mktexlsr を実行する必要があるかどうか以前に ls-R ファイルそのものが必要かどうか。
TeX Live で ls-R ファイルがある理由は、
- TeX Live のデフォルト設定である
- Momonga Linux が提供していた teTeX のデフォルト設定と同じである
- ls-R ファイルがない場合の tex 処理にストレスを感じた
- ルギア君はこのあと HDD を Toshiba から Western Digital に換装している
と言ったところ。
問題になるのは 3 番目の奴。ストレスを感じるかどうかは個人の問題である。
# hdparm -Tt /dev/sda /dev/sda: Timing cached reads: 1692 MB in 2.00 seconds = 846.49 MB/sec Timing buffered disk reads: 238 MB in 3.02 seconds = 78.73 MB/sec
こんな HDD で、ファイルシステムは ext4 (おそらくこれが nilfs2 だったりするとまた事情は全く変わる)。で、ls-R を使わないように設定し、ls-R を削除する。この時 kpsewhich -a でいろいろ探し、その実行時間を計測する。この計測は 2 回行い、ディスクキャッシュの効果を調べる。
まず、ls-R を使わない設定とは上の TEXMF= にて !! を外す (ls-R を探さない) のと、TEXMFDBS= から削除する (ls-R を作成しない)。なお、TEXMFDBS= を空にした場合の mktexlsr の実行は何もしないのと「ほぼ」等価。
--- /usr/share/texmf/web2c/texmf.cnf.orig 2011-09-16 19:44:22.000000000 +0900 +++ /usr/share/texmf/web2c/texmf.cnf 2011-09-22 22:44:02.036369322 +0900 @@ -117,7 +117,7 @@ % versions should take precedence over those (although it is generally a % source of confusion to have different versions of a package installed, % whatever the trees, so try to avoid it). -TEXMF = {$TEXMFCONFIG,$TEXMFVAR,$TEXMFHOME,!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFMAIN,!!$TEXMFLOCAL,!!$TEXMFDIST} +TEXMF = {$TEXMFCONFIG,$TEXMFVAR,$TEXMFHOME,$TEXMFSYSCONFIG,$TEXMFSYSVAR,$TEXMFMAIN,$TEXMFLOCAL,$TEXMFDIST} % Where to look for ls-R files. There need not be an ls-R in the % directories in this path, but if there is one, Kpathsea will use it. @@ -125,7 +125,8 @@ % does not create ls-R files in the non-!! elements -- because if an % ls-R is present, it will be used, and the disk will not be searched. % This is arguably a bug in kpathsea. -TEXMFDBS = {!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFMAIN,!!$TEXMFLOCAL,!!$TEXMFDIST} +%TEXMFDBS = {!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFMAIN,!!$TEXMFLOCAL} +TEXMFDBS = {} % The system trees. These are the trees that are shared by all the users. % If a tree appears in this list, the mktex* scripts will use
ls-R を削除。
# rm /usr/share/texmf-dist/ls-R rm: remove regular file `/usr/share/texmf-dist/ls-R'? y
[lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty /usr/share/texmf-dist/tex/latex/graphics/graphics.sty real 0m10.067s user 0m0.040s sys 0m0.173s [lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty /usr/share/texmf-dist/tex/latex/graphics/graphics.sty real 0m0.057s user 0m0.025s sys 0m0.031s [lugia@arpa-castle ~]$ time kpsewhich -a subfig.sty /usr/share/texmf-dist/tex/latex/subfig/subfig.sty real 0m0.105s user 0m0.023s sys 0m0.044s [lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty subfig.sty /usr/share/texmf-dist/tex/latex/graphics/graphics.sty /usr/share/texmf-dist/tex/latex/subfig/subfig.sty real 0m0.075s user 0m0.028s sys 0m0.043s
始めは時間がかかるが、2 回目以降はほぼ即時に返事が来る。
次に、mktexlsr を使う場合の実行時間を調べる (こちらは ls-R を読むだけのためディスクキャッシュの影響は殆どなくなる)。
# mv texmf.cnf.orig texmf.cnf # mktexlsr mktexlsr: Updating /usr/share/texmf/ls-R... mktexlsr: Updating /usr/share/texmf-config/ls-R... mktexlsr: Updating /usr/share/texmf-dist/ls-R... mktexlsr: Updating /usr/share/texmf-var/ls-R... mktexlsr: Done.
[lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty /usr/share/texmf-dist/tex/latex/graphics/graphics.sty real 0m0.125s user 0m0.108s sys 0m0.015s [lugia@arpa-castle ~]$ time kpsewhich -a subfig.sty /usr/share/texmf-dist/tex/latex/subfig/subfig.sty real 0m0.126s user 0m0.106s sys 0m0.019s [lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty /usr/share/texmf-dist/tex/latex/graphics/graphics.sty real 0m0.121s user 0m0.103s sys 0m0.016s [lugia@arpa-castle ~]$ time kpsewhich -a graphics.sty subfig.sty /usr/share/texmf-dist/tex/latex/graphics/graphics.sty /usr/share/texmf-dist/tex/latex/subfig/subfig.sty real 0m0.126s user 0m0.112s sys 0m0.013s
この場合、探す物の数はおろか回数や順番に依らず一定だということだ。残念なのは、
ディスクキャッシュより遅い
ことだ。
さて、実際のコンパイルではどれだけ速度に差がでるか、だ。ここでは 11 個の LaTeX ファイルを Makefile を使って pdf を作成するまで一気にやった時の実行時間を調べる。\ref{} を使ったので、platex は各々 2 回ずつ + dvipdfmx の実行である。なお、pdf 以外の画像ファイルでは、gs を実行する。
LATEX=platex -halt-on-error -interaction=nonstopmode -kanji=utf8 DVIPDFMX=dvipdfmx -V 5 EBB=ebb XBB=ebb -x SRCS=0.tex 1.tex 2.tex 3.tex 4.tex 5.tex \ 6.tex 7.tex 8.tex 9.tex 10.tex 11.tex HEADER=header.tex .SUFFIXES: .tex .dvi .pdf .png .jpg .bb .xbb .PHONY: all clean distclean all: $(SRCS:.tex=.pdf) .tex.dvi: $(LATEX) $< $(LATEX) $< .dvi.pdf: $(DVIPDFMX) $< .pdf.bb: $(EBB) $< .png.bb: $(EBB) $< .jpg.bb: $(EBB) $< 0.pdf: header.tex tashizan.f answer/0.f 1.pdf: header.tex answer/1/* 2.pdf: header.tex tridag.f 3.pdf: header.tex bounce.pdf bounce.bb hanabi.c 4.pdf: header.tex 5.pdf: header.tex 6.pdf: header.tex futo.f 7.pdf: header.tex 8.pdf: header.tex 9.pdf: header.tex 10.pdf: header.tex 11.pdf: header.tex clean: $(RM) $(SRCS:.tex=.dvi) $(SRCS:.tex=.aux) $(SRCS:.tex=.log) distclean: clean $(RM) $(SRCS:.tex=.pdf)
なお、ヘッダ部分は共通で、
\documentclass[a4j]{jsarticle} \usepackage{listings} \usepackage{amsmath} \usepackage[T1]{fontenc} %\usepackage[deluxe]{otf} \usepackage{inconsolata} \usepackage[charter]{mathdesign} \usepackage{bbding} \usepackage{nicefrac} \usepackage{faktor} \usepackage[dvipdfm]{graphicx} \usepackage{wrapfloat} \usepackage{color} % ...
である。まず、ls-R を使わない場合ですでにディスクキャッシュが効いている場合。
$ time make ... (略) ... real 0m27.445s user 0m11.954s sys 0m12.707s
ls-R を使わずに、ディスクキャッシュされてない場合。
$ time make ... (略) ... real 0m50.528s user 0m12.142s sys 0m13.495s
見かけでは殆ど変わったようには見えぬのだが…。なお、ディスクキャッシュは単純ではないので、kpsewhich を実行しておけば全てがキャッシュされる「わけではない」。多分ルーチンも違うかも。したがって、思わぬところで引っかかる可能性がでる。
ls-R を使った場合。
$ time make ... (略) ... real 0m16.989s user 0m13.888s sys 0m2.590s
kpsewhich の時と違ってかなり速くなった。
結論
- こういう事情では ls-R はもはや不要である、とも言える。
- とても遅くストレスになるならユーザーに変えてもらう。
パッケージのインストール
yum でインストールしたりアンインストールしたりする場合の mktexlsr の実行時間について考察する。
まずは ls-R あり。
# time yum remove -y texlive-texmf-latex-subfig Loaded plugins: dellsysid, installonlyn, langpacks, presto, refresh-packagekit Setting up Remove Process Resolving Dependencies --> Running transaction check ---> Package texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 will be erased --> Processing Dependency: texlive-texmf-latex-subfig >= 2010-6m for package: texlive-all-2010-2m.mo8.noarch --> Running transaction check ---> Package texlive-all.noarch 0:2010-2m.mo8 will be erased --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Removing: texlive-texmf-latex-subfig noarch 2010-9m.mo8 @momonga-devel-i686 920 k Removing for dependencies: texlive-all noarch 2010-2m.mo8 @momonga-devel-i686 0.0 Transaction Summary ================================================================================ Remove 1 Package (+ 1 Dependent package) Installed size: 920 k Downloading Packages: Running Transaction Check Running Transaction Test Transaction Test Succeeded Running Transaction Warning: RPMDB altered outside of yum. ** Found 2 pre-existing rpmdb problem(s), 'yum check' output follows: dejagnu-1.4.4-8m.mo8.noarch has missing requires of expect >= ('0', '5.21', None) flashplayer-plugin-11.0.d1.98-2m.mo8.x86_64 is a duplicate with flashplayer-plugin-10.3.181.26-1m.mo8.i686 Erasing : texlive-all-2010-2m.mo8.noarch 1/2 Erasing : texlive-texmf-latex-subfig-2010-9m.mo8.noarch 2/2 Removed: texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 Dependency Removed: texlive-all.noarch 0:2010-2m.mo8 Complete! real 2m22.534s user 0m16.565s sys 0m4.042s # time yum install -y texlive-texmf-latex-subfig Loaded plugins: dellsysid, installonlyn, langpacks, presto, refresh-packagekit local-development | 2.9 kB 00:00 ... local-development-Alter | 2.9 kB 00:00 ... local-development-Nonfree | 2.9 kB 00:00 ... momonga-devel-i686 | 3.6 kB 00:00 momonga-devel-i686/primary_db | 6.6 MB 00:01 momonga-devel-x86_64 | 3.6 kB 00:00 momonga-devel-x86_64/primary_db | 6.6 MB 00:01 Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: texlive-texmf-latex-subfig noarch 2010-9m.mo8 momonga-devel-i686 493 k Transaction Summary ================================================================================ Install 1 Package Total download size: 493 k Installed size: 920 k Downloading Packages: Setting up and reading Presto delta metadata Processing delta metadata Package(s) data still to download: 493 k texlive-texmf-latex-subfig-2010-9m.mo8.noarch.rpm | 493 kB 00:00 Running Transaction Check Running Transaction Test Transaction Test Succeeded Running Transaction Installing : texlive-texmf-latex-subfig-2010-9m.mo8.noarch 1/1 Installed: texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 Complete! real 0m19.150s user 0m12.730s sys 0m1.948s
次に ls-R なし。
# time yum remove -y texlive-texmf-latex-subfig Loaded plugins: dellsysid, installonlyn, langpacks, presto, refresh-packagekit Setting up Remove Process Resolving Dependencies --> Running transaction check ---> Package texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 will be erased --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Removing: texlive-texmf-latex-subfig noarch 2010-9m.mo8 @momonga-devel-i686 920 k Transaction Summary ================================================================================ Remove 1 Package Installed size: 920 k Downloading Packages: Running Transaction Check Running Transaction Test Transaction Test Succeeded Running Transaction Erasing : texlive-texmf-latex-subfig-2010-9m.mo8.noarch 1/1 Removed: texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 Complete! real 0m6.833s user 0m4.771s sys 0m1.144s # time yum install -y texlive-texmf-latex-subfig Loaded plugins: dellsysid, installonlyn, langpacks, presto, refresh-packagekit Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: texlive-texmf-latex-subfig noarch 2010-9m.mo8 momonga-devel-i686 493 k Transaction Summary ================================================================================ Install 1 Package Total download size: 493 k Installed size: 920 k Downloading Packages: Setting up and reading Presto delta metadata Processing delta metadata Package(s) data still to download: 493 k texlive-texmf-latex-subfig-2010-9m.mo8.noarch.rpm | 493 kB 00:00 Running Transaction Check Running Transaction Test Transaction Test Succeeded Running Transaction Installing : texlive-texmf-latex-subfig-2010-9m.mo8.noarch 1/1 Installed: texlive-texmf-latex-subfig.noarch 0:2010-9m.mo8 Complete! real 0m8.428s user 0m5.821s sys 0m1.342s
まあ、確かに速いな。半分…か…。
パッケージ数の削減
パッケージ数の削減は多いに構わないのだがいくつか問題もある。
極端な例として
/usr/share/texmf*
以下をすべて 1 つにまとめた場合、圧縮される分を考慮しても kdelibs-apidocs よりサイズがでかくなることは間違いない。DVD に収録されなくてもよいので、サイズに付いては問題ないかも知れないが (いくつか TeX 系に依存するパッケージ kile とかがドロップすることになるんだろう)。
まとめるとしてどういう風にまとめるかも少々問題ではある。自分の中であたためていた構想としては
texlive-pdftex \ texlive-texmf-pdftex / texlive-pdftex texlive-texmf-latex \ texlive-texmf-latex-* / texlive-latex ← ここが今 1167 個ある。 ...
といった感じ。ここで示したように、texlive-texmf-* なパッケージは実は 60% 以上が texlive-texmf-latex-* であり、均等なサイズに分けるというのは難しいだろう。
余談だが、本家のインストーラ install-tl では実に 2300 個以上 *1 のアーカイブをダウンロードして展開する。RPM と違って簡単に出し入れできないので、なぜそんなに細かく分けたのかは疑問が残る。パッケージ単位でインストールの設定出来るのかな…?
結論(?)
- 半ば当り前だが mktexlsr まで外さなくともとりあえず ls-R を作成させないだけでもインストール時間の削減は可能。
- パッケージ数の削減については latex-* を 1 つにするか複数にするかが問題とはなる
- インストールのしやすさ的には 1 つだろうな。
- これだけでも 700 個ぐらいまで減るんだな。
なんか淋しい。 - 多分カテゴリわけでやると 1/10 どころか 1/100 以下になると思われ。
その他の可能性について
texlive-* なパッケージをインストールしたりアップデートした際に yum 側で mktexlsr を実行するプラグインを書くことはできるだろうか。調べては見たものの資料があまりなかった。
監視する Daemon を作って
みたいなことをやるとか。ま、これも起動させるのを忘れたら話にならないので意味は無いかも。