Suspeito que o >>
esteja causando a contenção no arquivo nhtsa_vin_data.csv
entre os comandos curl
que parallel
está forking para coletar os dados da API.
Eu ajustaria sua inscrição assim:
$ 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/
Isso dará ao seu curl
comandos de seu próprio arquivo isolado para gravar seus dados.
Exemplo
Eu peguei esses 3 VINs, 1HGCR3F95FA017875;1HGCR3F83HA034135;3FA6P0T93GR335818;
, que você me forneceu e coloquei em um arquivo chamado vins.csv
. Eu então os repliquei várias vezes para que esse arquivo acabasse tendo essas características:
$ tail -1 vins.csv | grep -o ';' | wc -l
26
Número de linhas
$ wc -l vins.csv
15 vins.csv
Eu então executei meu script usando esses dados:
$ ./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
Colocando as coisas em conjunto
Quando o procedimento acima estiver concluído, você poderá usar cat
todos os arquivos juntos para obter um único arquivo .csv
ala:
$ cat *.par > all_data.csv
Tenha cuidado ao fazer isso, pois cada arquivo tem sua própria linha de cabeçalho para os dados CSV contidos nele. Para lidar com a retirada dos cabeçalhos dos arquivos de resultados:
$ cat <(head -1 $(ls *.par|head -1)) <(tail -q -n +2 *.par) > all_data.csv
Seu desempenho mais lento
Nos meus testes, parece que o site do DOT está restringindo as consultas enquanto elas continuam acessando a API. O tempo acima que vi em meus experimentos, embora pequeno, estava diminuindo à medida que cada consulta era enviada ao site da API.
Meu desempenho no meu laptop foi o seguinte:
$ seq 5 | parallel --will-cite --line-buffer 'yes {} | head -c 1G' | pv >> /dev/null
5GiB 0:00:51 [99.4MiB/s] [ <=> ]
NOTA: O texto acima foi emprestado da resposta de Ole Tange e modificado. Ele grava 5 GB de dados em parallel
e canaliza para pv >> /dev/null
. pv
é usado para que possamos monitorar o rendimento através do tubo e chegar a um tipo de medição MB / s.
Meu laptop conseguiu gerar ~ 100MB / s de taxa de transferência.
Perguntas frequentes sobre a API do NHTSA
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"
O acima menciona que há um limite superior ao usar a API:
There is an upper limit on the number of VINs you can put through this service.