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 :
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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}"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?
Partager