Ce que je veux faire:
- télécharger les données OSM (OpenStreetMap) à intervalles réguliers (ou les mettre à jour à l’aide de diffs)
- parsingr ces données, qui est un xml compressé bzip2, et stocker les pièces qui me concernent dans ma firebase database, en optimisant au maximum l’efficacité de la mémoire + du processeur (le temps d’exécution n’est pas un gros problème)
Ce que j’ai:
- Fichier xxx.osm.bz2 (xz compressé bzip2), 29 Go compressé, environ 400 Go non compressé
- le logiciel tourne sous Debian Linux, aucune machine virtuelle ou quoi que ce soit impliqué
Questions spécifiques, pour élaborer quel est mon problème:
- J’ai trouvé des bibliothèques de stream de fichiers bzip2 pour c ++, mais je ne sais pas comment gérer cela en c (décomposer séquentiellement les données et les utiliser (les parsingr dans mon cas) simultanément), comment dois-je procéder?
- libxml2 et toutes les autres bibliothèques utilisables traitant de XML que j’ai trouvées ont analysé l’ensemble du XML et vous ont laissé le travail ultérieur, mais je ne veux pas vraiment avoir un xml de plusieurs Go en mémoire juste pour le filtrer séquentiellement – suis-je mal sur libxml2 et a-t-il réellement une telle fonctionnalité? Ou y a-t-il une autre bibliothèque que je peux utiliser?
- Peut-être qu’il existe même une bibliothèque de plus haut niveau pour ce faire, déjà spécialisée dans les données OSM? Je n’ai rien trouvé de tel, et les outils fournis ne m’aident pas vraiment (je ne prévois pas de filtrer les données d’abord avec Osmosium ou autre, puis de les filtrer à nouveau avec mon code, ce serait extrêmement inefficace, je pense. )
J’espère avoir pu énoncer clairement ma question et je serais très reconnaissant si quelqu’un pouvait au moins m’indiquer la bonne direction.
Merci beaucoup.
Mise à jour: Juste après avoir posté ceci, j’ai découvert que libxml2 fournit effectivement xmlTextReader à partir de la version 2.5.0, ce qui répond en partie à ma question. ouvert à des solutions totalement différentes encore bien sûr).
Mise à jour 2: La solution doit fonctionner à partir d’un processus en cours d’exécution et doit (comme indiqué au point 2) être efficace en termes de mémoire + cpu. Par conséquent, les données ne doivent pas être copiées des dizaines de fois (en mémoire ou sur disque).
Vous ne faites pas de décompression bzip2 dans votre programme, il vous suffit de lire du code XML non compressé à partir de stdin et de l’parsingr avec libxml2 (ou equvalent). Ensuite, appelez votre programme de cette manière et profitez de la profusion de pipes Unix:
bzip2 -d < planet.osm.bzip2 | yourtool