Il mio laptop è del 2015, CPU ~i5 8 GB RAM SSD
- BBOX Calabria
tr -d '"' <population_ita_2019.csv | awk -F, 'NR == 1 || ( 15.6 <= $2 && $2 <= 17.25 && 37.9 <= $1 && $1 <= 40.15 && $3 != 0 )' >output_awk.csv
tempo: 1m7s
xsv search -s Lat '37\.9|3[8-9]\.|40\.0+|40\.1[0-4]|40\.150*$' population_ita_2019-07-01.csv | xsv search -s Lon '15\.[6-9]|16\.|17\.[0-1]|17\.2[0-4]|17\.250*$' | xsv search -s Population '[^0.0]' >output_xsv.csv
tempo: 13s
ogr2ogr -f "CSV" output_ogr.csv virtual.vrt -sql "SELECT "Lat", "Lon", "Population" FROM "population_ita_2019" where Lon >= 15.6 AND Lon <= 17.25 AND Lat >= 37.9 AND Lat <= 40.15 AND Population > 0.0"
tempo: 4m14s
mlr --csv filter '($Lat >=37.9 && $Lat <=40.15) && ($Lon >=15.6 && $Lon <=17.25) && ($Population>0)' population_ita_2019-07-01.csv >output_mlr.csv
tempo: 2m13s
PS: Con Miller potrei dare direttamente il file *.zip, risparmiando il tempo di unzip
Utility | tempo |
---|---|
XSV | 13s |
awk | 1m7s |
mlr | 2m14s |
ogr2ogr | 4m14s |
Non conoscevo XSV: grazie per l'utilissimo post. Aggiungerò questo strumento alla mia cintura degli attrezzi!
Se posso fare un commento, il motivo per il quale XSV vince a mani basse questo confronto è che usando le regex evita lo step di conversione da stringa a virgola mobile (
atof
in ANSI C), operazione molto più costosa del confronto tra due numeri, ed anche di una regex semplice. Inoltre il comando XSV è strutturato come una pipeline di tre invocazioni e dunque può essere eseguito da tre processi paralleli, cosa che con le altre utility non avviene.Comunque quando si tratta di scrivere strumenti efficienti, Rust è sempre una ottima scelta...
Visto che scrivere regex strette può essere difficile/laborioso, un approccio alternativo potrebbe essere dare una prima scrematura larga
(per esempio
(3[7-9]|40)\.
) e poi usare un filtro numerico con uno degli altri strumenti.