udev - ваш друг.
вы можете добавить файл под названием 99-gamepad.rules
в /etc/udev/rules.d/
, который должен содержать строка, аналогичная следующей
DRIVER=="usb",ATTRS{idProduct}=="c52b",RUN+="/path/to/your_script.sh"
. Вы можете найти ATTRS
, используя udevadm
:
udevadm info -a -p /sys/bus/usb/devices/3-1.5
replace /sys/bus/usb/devices/3-1.5
, указав путь к вашему USB-устройству в sys; в качестве альтернативы вы можете использовать путь в / dev /
. Обычно я просто пробую несколько путей, пока не найду что-то, что подходит моему устройству.
если вы знаете путь к устройству в / dev
, то вы можете использовать следующую строку:
udevadm info -a -p $(udevadm info -q path -n /dev/input/js0)
Вот страница руководства udev, объясняющая, как написать правило.
Также посмотрите страницу udev в ArchWiki.
Я подозреваю, что >>
вызывает у вас конкуренцию за файл nhtsa_vin_data.csv
среди команд curl
, которые parallel
разветвляются для сбора данных API.
Я бы поправил ваше приложение так:
$ cat p.bash
#!/bin/bash
cat vins.csv | parallel --will-cite -j10% --progress --tmpdir. --files \
curl -s --data "format=csv" \
--data "data={1}" https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/
Это даст вашим curl
командам собственный изолированный файл для записи своих данных.
Я взял эти 3 номера VIN, 1HGCR3F95FA017875;1HGCR3F83HA034135;3FA6P0T93GR335818;
, которые вы мне предоставили, и поместил их в файл под названием vins.csv
. Затем я воспроизвел их несколько раз, чтобы этот файл имел эти характеристики:
$ tail -1 vins.csv | grep -o ';' | wc -l
26
Количество строк$ wc -l vins.csv
15 vins.csv
Затем я запустил свой скрипт, используя эти данные:
$./p.bash
Computers / CPU cores / Max jobs to run
1:local / 1 / 1
Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete
local:1/0/100%/0.0s./pard9QD3.par
local:1/1/100%/10.0s./paruwK9L.par
local:1/2/100%/8.5s./parT6rCS.par
local:1/3/100%/7.3s./pardzT2g.par
local:1/4/100%/6.8s./parDAsaO.par
local:1/5/100%/6.8s./par9X2Na.par
local:1/6/100%/6.7s./par6aRla.par
local:1/7/100%/6.7s./parNR_r4.par
local:1/8/100%/6.4s./parVoa9k.par
local:1/9/100%/6.1s./parXJQTc.par
local:1/10/100%/6.0s./parDZZrp.par
local:1/11/100%/6.0s./part0tlA.par
local:1/12/100%/5.9s./parydQlI.par
local:1/13/100%/5.8s./par4hkSL.par
local:1/14/100%/5.8s./parbGwA2.par
local:0/15/100%/5.4s
Когда все вышеперечисленное выполнено, вы можете cat
объединить все файлы, чтобы получить один .csv
файл аля:
$ cat *.par > all_data.csv
Будьте осторожны при этом, так как каждый файл имеет свою собственную строку заголовка для содержащихся в нем данных CSV. Чтобы справиться с удалением заголовков из файлов результатов:
$ cat <(head -1 $(ls *.par|head -1)) <(tail -q -n +2 *.par) > all_data.csv
В ходе моего тестирования оказалось, что веб-сайт DOT ограничивает запросы, поскольку они продолжают получать доступ к своему API. Приведенное выше время, которое я наблюдал в своих экспериментах, хотя и было небольшим, уменьшалось по мере того, как каждый запрос отправлялся на веб-сайт API.
Моя производительность на моем ноутбуке была следующей:
$ seq 5 | parallel --will-cite --line-buffer 'yes {} | head -c 1G' | pv >> /dev/null
5GiB 0:00:51 [99.4MiB/s] [ <=> ]
ПРИМЕЧАНИЕ.:Вышеизложенное было заимствовано из ответа Оле Танге и изменено. Он записывает 5 ГБ данных через parallel
и передает их на pv >> /dev/null
. pv
используется, чтобы мы могли отслеживать пропускную способность канала и получать тип измерения МБ/с.
Мой ноутбук смог обеспечить ~пропускную способность 100 МБ/с.
API
For the ‘Decode VIN (flat format) in a Batch’ is there a sample on making this query by URL, similar to the other actions?
For this particular API you just have to put a set of VINs within the box that are separated by a “;”. You can also indicate the model year prior to the “;” separated by a “,”. There is an upper limit on the number of VINs you can put through this service.
Example in the box is the sample: 5UXWX7C5*BA,2011; 5YJSA3DS*EF
Source: https://vpic.nhtsa.dot.gov/MfrPortal/home/faq searched for "rate"
Выше упоминается, что существует верхний предел при использовании API:
There is an upper limit on the number of VINs you can put through this service.
Производительность обычно ограничивается одним из этих:
sudo iftop
, чтобы увидеть, используется ли ваше сетевое соединение на 100%. iostat -dkx 1
, чтобы увидеть, используется ли ввод-вывод любого из ваших дисков на 100%. top
, если ваши процессоры загружены на 100%. Нажмите 1
, чтобы просмотреть отдельные потоки ЦП. Если один из них равен 100%, то у вас есть однопоточная программа, которая ограничена этим. GNU Parallel хорошо справляется с параллельным выполнением заданий, чтобы использовать больше пропускной способности, дискового ввода-вывода и ЦП.
Но и у него есть свои ограничения.
GNU Parallel обычно кэширует вывод в /tmp
. Это означает, что ваш дисковый ввод-вывод на /tmp
может быть узким местом.
К счастью, имея дело с CSV, вы редко заботитесь о порядке строк. :Это нормально, если строки смешиваются, если это полные строки.
Если вы используете --line-buffer
из версии >20170822, тогда GNU Parallel не буферизует вывод на диск -, а только одну полную строку в памяти. Для этого требуется немного больше ресурсов ЦП, поэтому проверьте, использует ли parallel
100% ЦП. Если он использует меньше, значит, вы не попали в это узкое место.
$ cat vins.csv | parallel --line-buffer curl -s --data "format=csv" \
--data "data={1}" https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/ \
>> /nas/BIGDATA/kemri/nhtsa_vin_data.csv
Вы можете увидеть, есть ли локальное узкое место,:
$ seq 1000 | parallel --line-buffer 'yes {} | head -c 1G' | pv >> /nas/BIGDATA/test
На моем паршивом ноутбуке скорость составляет около 100 Мбайт/с. Так что мой паршивый ноутбук сможет работать с 1 Гбит/с от dot.gov.