[bash] Fusionner plusieurs JSON
Bonjour à toi, basheur curieux !
Ayant plusieurs millions de fichiers JSON (correspondant pour chacun à une ville du monde), j'aimerais pouvoir fusionner le tout en un seul fichier JSON afin de balancer le tout en bulk_import dans une base de données CouchDB. Je me suis donc mis à écrire un petit script bash :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #!/bin/bash
json='{ "docs" : ['
FILES=./cities/*
for filepath in $FILES
do
json="${json}$(cat $filepath),"
done
json="${json%?} ] }"
echo $json
curl -vX POST http://root:********@127.0.0.1:5984/cities/_bulk_docs -H 'Content-Type: application/json' -d "${json}" |
Malheureusement, je me suis aperçu en lançant cette commande sur mon gros dossier que l'exécution était beaucoup, beaucoup trop longue. Je me suis donc creusé la tête pour optimiser le tout, et j'en suis rendu au code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/bin/bash
echo '{ "docs" : [' > tmp
FILES=./cities/*
for filepath in $FILES
do
echo "$(cat $filepath)," >> tmp
done
json=`cat tmp`
json="${json%?} ] }"
echo "${json}" > tmp
curl -vX POST http://root:********@127.0.0.1:5984/cities/_bulk_docs -H 'Content-Type: application/json' -d "${json}" |
J'ai comparé la vitesse d'exécution de ces deux codes sur un échantillon de 1000 fichiers JSON, ce qui me donne 10.431s pour le premier code, et 5.612s pour le second.
J'aimerais savoir si il reste des points à améliorer, j'ai l'impression que certaines parties de mon code sont encore mal pensées (exemple du stockage du contenu du fichier dans une variable pour virer la dernière virgule). Pourriez vous m'aider à rendre l'exécution de ce code la plus rapide et la plus "propre" possible ?