Je dois charger un seul file XML volumineux (40 Go +) dans une table de database SQL Server 2012 à l'aide de SSIS. J'ai des problèmes parce que SSIS semble essayer de charger le document entier en memory au lieu de le diffuser.
Voici plus de détails de mon package SSIS.
J'ai créé une source XML avec les propriétés suivantes:
La structure XML est simple, avec seulement 3 niveaux hiérarchiques:
J'ai besoin d'insert un logging de database par élément feuille, en répétant les champs des niveaux supérieurs de la hiérarchie. En d'autres termes, j'ai besoin d'aplatir la hiérarchie XML.
Comment est-ce que je peux charger le stream de SSIS datatables, au lieu d'essayer de charger le document entier dans la memory?
La source XML charge toujours le file entier. Il utilise XmlDocument
pour le faire (la dernière fois que j'ai vérifié).
La seule chose que vous pouvez faire est de split le file d'une manière ou d'une autre, puis d'exécuter chaque morceau de manière itérative dans votre stream de données.
Au-delà, vous cherchez à créer une source de données personnalisée, ce qui n'est pas sortingvial. Il représente également un morceau de code sérieux à maintenir.
Il peut y avoir des sources de données tierces qui peuvent le faire. Je devais écrire le mien il y a environ cinq ans.
Avez-vous envisagé de traiter les files en plus petits morceaux?
J'ai eu le même problème auparavant, j'ai donc créé un composant de script pour traiter ce gros file XML en 100 de plus petits files XML, puis faire un forloop et itérer sur tous les petits files XML à traiter.
Pour ce faire, vous ne pouvez pas utiliser StreamReader.ReadLine
car il fera toujours la même chose, charger ce file très volumineux, au lieu de cela, utilisez System.IO.MemoryMappedFiles
qui est une class conçue pour ce scénario.
Jetez un oeil ici http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile.aspx