Понимание LC_ALL = C и его значение для стандартных английских символов - PullRequest
0 голосов
/ 17 сентября 2018

Простите за неуклюжий способ, которым я подхожу к этому вопросу, все, что я узнал до сих пор по теме кодирования символов, было за последние несколько часов, и я знаю, что я вне глубина. На этот вопрос можно ответить в другом месте на сайте, например, в моих связанных вопросах, но если это так, то эти ответы слишком плотные, чтобы я мог точно понять, что в них делается.

Мне часто требуется grep через папки с чрезмерно большими текстовыми файлами (общим объемом более 100 ГБ). Я читал о том, как использование LC_ALL=C может ускорить это значительно , но я хочу быть уверен, что выполнение не повлияет на точность мои поиски.

Файлы старые и прошли через множество различных сетевых источников, поэтому, скорее всего, содержат путаницу символов из разных кодировок, включая UTF-8. ( Кроме того, возможно ли, чтобы один файл содержал символы из нескольких кодировок ?)

Основная часть того, что меня беспокоит, такова: если я хочу найти определенный b в моих данных, могу ли я ожидать, что каждая буква b, присутствующая в данных, будет закодирована как ASCII, или же Буква также будет закодирована как UTF-8?

Или, другими словами, символы ASCII всегда и исключительно ASCII? Если даже стандартные английские символы могут быть закодированы как UTF-8, а использование LC_ALL=C grep игнорирует все символы UTF-8, то это будет означать, что мои поиски будут пропускать поисковые термины, отсутствующие в ASCII, что, очевидно, не будет поведение, которое я хочу, и было бы значительным препятствием для принятия LC_ALL=C для grep.

1 Ответ

0 голосов
/ 18 сентября 2018

О понимании UTF-8 против ASCII, очень хорошо следующее:
http://kunststube.net/encoding/ https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/

О разнице во времени с grep для файлов UTF-8 с небольшим количеством неСимвол ASCII, в принципе нет никакой разницы при использовании LC_ALL = C или LANG = C по сравнению со стандартным LANG = en_US.UTF-8 или аналогичным.

Тест, выполненный на 64-битном Cygwin, повторяющий 1000 раз поиск по 20 ГБ текста:

$ time for i in $(seq 1000) ; do  grep -q LAPTOP-82F08ILC wia-*.log ; done

real    0m53.289s
user    0m7.813s
sys     0m31.635s

$ time for i in $(seq 1000) ; do  LC_ALL=C grep -q LAPTOP-82F08ILC wia-*.log ; done

real    0m53.027s
user    0m7.497s
sys     0m31.010s
s

    $ ls -sh wia-*
     10G wia-1024.log  160M wia-16.log  2.5G wia-256.log   40M wia-4.log    639M wia-64.log
    1.3G wia-128.log    20M wia-2.log   320M wia-32.log   5.0G wia-512.log   80M wia-8.log

Разница в пределах допуска на повторение, который был в 53-55 секундах для обоихслучаи

...