Portál AbcLinuxu, 28. března 2024 12:36

Filtrujme čtivé texty z Projektu Gutenberg 6

27. 4. 2016 | Karel Kulhavý
Články - Filtrujme čtivé texty z Projektu Gutenberg 6  

V minulém díle jsem naznačil, že ze strany nesouvisející internacionalizace operačního systému přijde neočekávaný problém. Tuto interakci si předvedeme.

Internacionalizace umožnila mimo jiné to, že spousta lidí na Zemi si může nechat vypisovat chybové hlášky operačního systému ve svém rodném jazyce:

$ ( for a in $(locale -a|grep -i utf); do LC_ALL="$a" . owhxeddo; done ) 2>&1 | sort | uniq

bash: owhxeddo: 그런 파일이나 디렉터리가 없습니다
bash: owhxeddo: そのようなファイルやディレクトリはありません
bash: owhxeddo: Adresár alebo súbor neexistuje
bash: owhxeddo: Adresář nebo soubor neexistuje
bash: owhxeddo: Arquivo ou diretório não encontrado
bash: owhxeddo: Aucun fichier ou dossier de ce type
bash: owhxeddo: Bestand of map bestaat niet
bash: owhxeddo: Böyle bir dosya ya da dizin yok
bash: owhxeddo: Datei oder Verzeichnis nicht gefunden
bash: owhxeddo: Datoteka ali imenik s tem imenom ne obstaja
bash: owhxeddo: El fitxer o directori no existeix
bash: owhxeddo: Filen eller katalogen finns inte
bash: owhxeddo: File o directory non esistente
bash: owhxeddo: Ingen sådan fil eller filkatalog
bash: owhxeddo: Ingen slik fil eller filkatalog
bash: owhxeddo: Không có tập tin hoặc thư mục như vậy
bash: owhxeddo: Necun tal file o directorio
bash: owhxeddo: Nema takve datoteke ili direktorija
bash: owhxeddo: Nie ma takiego pliku ani katalogu
bash: owhxeddo: Nincs ilyen fájl vagy könyvtár
bash: owhxeddo: No existe el fichero o el directorio
bash: owhxeddo: Non hai tal ficheiro ou directorio
bash: owhxeddo: No such file or directory
bash: owhxeddo: Tidak ada berkas atau direktori seperti itu
bash: owhxeddo: Tiedostoa tai hakemistoa ei ole
bash: owhxeddo: Toks failas ar aplankas neegzistuoja
bash: owhxeddo: Δεν υπάρχει τέτοιο αρχείο ή κατάλογος
bash: owhxeddo: Немає такого файла або каталогу
bash: owhxeddo: Нет такого файла или каталога
bash: owhxeddo: Няма такъв файл или директория
bash: owhxeddo: файл ці тэчка ня йснуе
bash: owhxeddo: 沒有此一檔案或目錄
bash: owhxeddo: 没有那个文件或目录

V čem je ale problém? Úmysl byl, aby se dalo měnit nastavení jazyka, to se měnit dá. Jenže kromě zamýšleného efektu nastal i efekt nezamýšlený, anglicky tzv. unintended consequences. Tato wikipedijní stránka mi přijde jako zábavné čtivo sama o sobě.

Počítač musel totiž začít zpracovávat texty v kódování UTF-8, kde znaky mají třeba 3 bajty délky a ještě hůře, jejich délka je proměnlivá. Kde bylo dříve možné použít velmi rychlé vyhledávací tabulky pro 1 bajt (256 položek), která se vejde i do velmi rychlé L1 cache s náhodným přístupem v řádu jednotek nanosekund, teď by byla třeba příliš rozměrná tabulka pro 4 bajty (4 miliardy položek), která by se často nevešla ani do RAM. Musela by se umístit na pevný disk, kde náhodný přístup trvá řádově milisekundy, je tedy řádově miliónkrát pomalejší! Proto se musí začít používat komplexnější algoritmy, které jsou pomalejší. Zkusíme si tedy, o kolik rychleji to poběží, když před různé příkazy v této pipeline zařadíme LC_ALL=C, které toto komplexní chápání znaků vypíná:

$ ( time cut -f 7 -d ' ' clean2.txt  |sort -n |uniq -c | sort -nrk1 >/dev/null ) 2>&1 |grep user
user	0m4.396s

$ ( time LC_ALL=C cut -f 7 -d ' ' clean2.txt  |sort -n |uniq -c | sort -nrk1 >/dev/null ) 2>&1 |grep user
user	0m4.329s

$ ( time cut -f 7 -d ' ' clean2.txt  |LC_ALL=C sort -n |uniq -c | sort -nrk1 >/dev/null ) 2>&1 |grep user
user	0m3.832s

$ ( time cut -f 7 -d ' ' clean2.txt  |sort -n |LC_ALL=C uniq -c | sort -nrk1 >/dev/null ) 2>&1 |grep user
user	0m4.032s

$ ( time cut -f 7 -d ' ' clean2.txt  |sort -n |uniq -c | LC_ALL=C sort -nrk1 >/dev/null ) 2>&1 |grep user
user	0m1.360s

$ ( time LC_ALL=C cut -f 7 -d ' ' clean2.txt  |LC_ALL=C sort -n |LC_ALL=C uniq -c | LC_ALL=C sort -nrk1 >/dev/null ) 2>&1 |grep user
user	0m0.575s

Ano, řekněme to nahlas: zavedení internacionalizace mělo za následek, že si v bashi, Firefoxu atd. chybové hlášky a menu můžeme nastavit česky, a současně před spoustu příkazů v bashových skriptech musíme psát LC_ALL=C, jinak nám poběží výrazně pomaleji.

V příštím díle využijeme tuto znalost k urychlenému třídění souborů podle délky, výrobě statistiky délek a inspekci, co nejdelší soubory obsahují.

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.