2017-03-27 2 views
1

J'ai un gros fichier (~ 2Gb) yaml. J'utilise la bibliothèque yaml-cpp et la fonction YAML::Loadfile. Mais j'ai un problème de pénurie de RAM.Comment diviser un fichier yaml en plusieurs fichiers?

Quelle est la manière la plus facile de diviser ce fichier en plusieurs petits fichiers de manière à ce que chaque petit fichier soit un fichier yaml valide (peut-être par les capacités de Linux)?

+0

Donc [ma réponse] (http://stackoverflow.com/a/42861599/347964) sur votre question précédente n'est pas une option? – flyx

+0

@flyx Je n'ai pas trouvé d'exemples d'utilisation de 'HandleNextDocument' et j'ai décidé de trouver un autre moyen. –

Répondre

1

Si vous avez plusieurs documents dans votre fichier, vous pouvez alors diviser --- au début de la ligne.

Si vous n'avez pas plusieurs documents (ou si vous en avez plusieurs, mais ils sont encore trop gros), votre document a soit un mappage au niveau supérieur, soit une séquence (en théorie, vous pouvez également avoir plusieurs ligne scalaire, mais c'est peu probable). Si le niveau supérieur de votre document a un style de flux (mappage avec { }, séquence avec [ ]), les choses dépendent beaucoup de la disposition. Mais s'il a un style de bloc, vous pouvez facilement trouver les clés individuelles de la carte de niveau supérieur ou les éléments de la séquence. Ils ont tous la même indentation que le premier élément (très probablement zéro retrait).

Fractionnez votre document YAML en fonction des informations ci-dessus et traitez chaque élément seul.

+0

Je ne peux même pas charger ce fichier dans ma RAM ('top' montre 100% d'utilisation de RAM à un moment donné). –

+0

Pourquoi voudriez-vous le charger en RAM? Vous pouvez regarder les premières lignes avec 'head', ou' grep -e '^ ---' 'pour voir s'il y a plusieurs documents. – Anthon

+0

J'ai un tel fichier yaml https://pastebin.com/J0mTqmWh –