Я подозреваю, что >>
вызывает у вас конкуренцию за файл 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.
$ awk 'BEGIN{FS=OFS=","} {if ($1==p) gsub(/./," ",$1); else p=$1} 1' file
ACCIDENT EP 4 STEM PERCUS,, 42:30, 43:04, 0:34
,, 43:04, 43:16, 0:11
AICHA 1 COMPLET DECOUPE,, 27:38, 28:42, 1:03
AICHA 2 COMPLET MIX 1,, 23:21, 24:02, 0:40
$ awk '$1!=last { last=$1; print; next; }; { $1=" "; print; }' input
A b c
E R
F T
B F T
G 5
C T 5
H 4