Проверка текущего уровня аудиовыхода в реальном времени -

В качестве мысленного эксперимента я хотел посмотреть, насколько далеко мы можем продвинуть инструменты CLI для решения такого рода проблем. С этой целью я хотел попробовать использовать CLI-инструмент для быстрого хэширования xxHash для выполнения этой работы.

xxHash is an extremely fast non-cryptographic hash algorithm, working at speeds close to RAM limits. It is proposed in two flavors, 32 and 64 bits.

Он доступен в каждом языке программирования, но для этого эксперимента я собираюсь использовать разновидность CLI, xxhsum, в частности, 32-битный режим, поэтому xxhsum -H0.

Как вы уже выяснили и как заявляли другие, повторный вызов инструмента CLI хэш-функции или любого другого инструмента обычно приводит к тому, что подходы такого типа терпят неудачу. Вызов xxhsumздесь 5 миллионов раз был бы неоптимальным -способом его использования. Его сила заключается в файловом вводе-выводе, так что, если бы мы взяли 5 миллионов строк и преобразовали их в файлы размером 5 миллионов?

Эта задача на самом деле тривиальна в Linux с помощью команды split:

split -l 1 afile

И насколько быстро будет хешировать, скажем, 1 миллион этих файлов, в каждом из которых есть такая строка.

образец 1-строчного файла
$ cat datadir/xzeyw
{"name": "John4000", "surname": "Gates", "country": "Germany", "age": "20", "height": "180"} 
каталог с 1M файлами
$ ls -l datadir | wc -l
1000002
пора их смешивать
$ { time xxhsum -H0 * >../nfile 2>&1 ;} |& awk '/real|user|sys/ {print $1": "$2"\t"}' | tr -d '\n'
real: 0m6.998s  user: 0m5.007s  sys: 0m1.569s

Да, верно, это заняло ~7 секунд! Я нахожу это довольно впечатляющим. Используя xxhsumтаким образом, мы понесли затраты на его запуск только один раз и позволили ему пройти через 1 миллион файлов.

Недостатки этого метода

Таким образом, одним из недостатков этого способа является, конечно, split. Это становится нашей самой дорогой операцией, как вы можете себе представить. Поскольку нам нужно взять один файл с X строками и взорвать его на жесткий диск как X файлов с одной строкой в ​​нем.

Вот некоторые из этих данных:

./hashy.bash

make data
---------
real: 0m17.492s user: 0m12.434s sys: 0m4.788s

split data
----------
real: 2m15.180s user: 0m0.700s  sys: 2m4.443s

hash data
---------
real: 0m6.487s  user: 0m5.798s  sys: 0m0.459s

Здесь мы видим, что наша splitоперация заняла ~2 минуты.ПРИМЕЧАНИЕ.:В первой строке этого вывода показано время создания файла с 1 млн строк JSON.

Другим недостатком является количество файлов, с которыми мы имеем дело в командной строке. Я использую *в некоторых местах, так что это расширится до 1M или 5M имен файлов, что может считаться опасным, это так. Имейте в виду, что при увеличении количества файлов вы рискуете превысить объем пространства, выделенного для аргументов командной строки.

Обратитесь к этим ссылкам относительно длины командной строки:

Заключение

Как вы понимаете, решение подобной проблемы с помощью файлов размером 1 или 5 МБ кажется почти нелепым. И мне пришлось бы согласиться. Но это все равно интересный эксперимент, поскольку он показывает, что если вы используете инструменты CLI соответствующим образом, вы можете добиться от них отличной производительности.

Код для hashy.bash

Если кому интересно код:

$ cat hashy.bash
#!/bin/bash

echo ""
echo "make data"
echo "---------"
rm -f afile
{ time for i in {0..1000000};do echo "{\"name\": \"John${i}\", \"surname\": \"Gates\", \"country\": \"Germany\", \"age\": \"20\", \"height\": \"180\"}">> afile ;done ;} \
  |& awk '/real|user|sys/ {print $1": "$2"\t"}' | tr -d '\n'
echo ""
echo ""

rm -fr datadir && mkdir datadir && cd datadir

echo "split data"
echo "----------"
{ time split -l 1../afile ;} |& awk '/real|user|sys/ {print $1": "$2"\t"}' | tr -d '\n'
echo ""
echo ""

echo "hash data"
echo "---------"
{ time xxhsum -H0 * >../nfile 2>&1 ;} |& awk '/real|user|sys/ {print $1": "$2"\t"}' | tr -d '\n'

cd - > /dev/null 2>&1
echo ""
echo ""

Ссылки

0
30.07.2020, 10:59
1 ответ

pacmdиспользует переменную окружения XDG_RUNTIME_DIR, чтобы найти путь к работающему демону PulseAudio. Однако в соединении будет отказано, если пользователи не совпадают. Это означает, что root не может напрямую запустить pacmdдля связи с PulseAudio обычного пользователя.

Ваш скрипт, работающий от имени пользователя root, может использовать sudoи запускать pacmdот имени нужного пользователя, по-прежнему с правильным XDG_RUNTIME_DIR(, как в этом ответе). Сценарий должен знать несколько значений.

Как обычный пользователь с доступом к PulseAudio (т.е. когда pacmd list-sink-inputsработает )вызывает:

id -u
echo "$XDG_RUNTIME_DIR"

Вывод будет, например. 1000и /run/user/1000соответственно. Затем используйте эти значения в скрипте. Это будет как:

sudo -u '#1000' XDG_RUNTIME_DIR=/run/user/1000 pacmd … | grep …

Обратите внимание, что общие переменные, передаваемые с помощью sudo VAR=value …, имеют ограничения (, см.man 8 sudo).Я не уверен, что запуск sudoот имени root что-то меняет. Если ваш sudoнастроен так, чтобы не разрешать установку XDG_RUNTIME_DIRтаким образом, используйте оболочку:

sudo -u '#1000' sh -c 'XDG_RUNTIME_DIR=/run/user/1000 pacmd …' | grep …
1
08.04.2021, 06:49

Теги

Похожие вопросы