Midnight Commander + file(1) sorunu
Merhaba,
Bir kaç zamandır dikkatimi çeken bir sorunla bugün ilgilenme fırsatı
buldum. Benzer sorundan muzdarip olanlara da yararlı olabilir düşüncesiyle
buraya yazayım dedim.
Midnight Commander, nam-ı diğer "mc" sık kullandığım bir programdır. Bu
sık kullandığım programda en sık yaptığım işlem de F3 (veya Enter) tuşu ile
dosyalara bakmak veya F4 ile düzenlemek. Gel gelelim makinede tam tarihini
hatırlayamadığım bir güncellemeden beri mc'deki bu göz atma ve düzenleme
işlemlerinde, özellikle büyük dosyalarda, olağanüstü bir yavaşlık oluyordu.
Örnek vermem gerekirse, 170K civarı bir dosyaya (1.4GHz'lik Pentium M
işlemcili makinede) F3 ile bakınma işlemi yaklaşık 9 sn sürüyordu.
strace(1) ile programın ne iş çevirdiğini inceledim ve bu bakınma/düzenleme
işlemlerinde mc'nin dosya tipini tayin etmek için file(1) komutunu fork
ettiğini farkettim. Yani (en azından bu makinede) sorun file(1) komutunda:
$ du -h iri.tex
172K iri.tex
$ file --version
file-4.21
magic file from /etc/magic:/usr/share/file/magic
$ time file iri.tex
iri.tex: LaTeX 2e document text
real 0m9.232s
user 0m8.865s
sys 0m0.016s
Görüldüğü gibi file(1) kararını ~9 s'de veriyor! Süreç zamanı ağırlıklı
olarak "user" tarafında olduğundan bunun çekirdek ile alakalı olmadığını
düşünebiliriz. Sorun Türkçe'ye özel mi?
$ (export LC_ALL=en_US.UTF-8; time file iri.tex)
iri.tex: LaTeX 2e document text
real 0m3.190s
user 0m3.092s
sys 0m0.008s
Biraz öyle görünüyor. Devam edelim...
$ (export LC_ALL=C; time file iri.tex)
iri.tex: LaTeX 2e document text
real 0m0.076s
user 0m0.060s
sys 0m0.000s
Sonuç:
$ echo "9.232/0.076" | bc
121
121 katlık bir fark! Öyle anlaşılıyor ki file(1)'ın bu yeni sürümlerinde
öncelikle UTF8 ile alakalı ve Türkçe işin içine girdiğinde katmerleşen bir
sorun var. Burada verdiğim rakamları (mümkünse farklı dağıtımlarda) siz de
doğrularsanız memnun olurum, hata raporu geçmeden önce emin olalım. Geçici
bir çözüm olarak aşağıdaki adımları uyguladım:
$ cp /usr/bin/file /usr/bin/file.exec
$ cat >/usr/bin/file
#!/bin/sh
LC_ALL=C exec /usr/bin/file.exec "$@"
(bu noktada Ctrl-D tuşluyoruz)
Tabii bu çözümün yan etkileri olacaktır mutlaka. Yine de önceden 9 s'de
açılan bir dosyayı saniye altında açmak için buna değer...
--
roktas
Reply to: