SSIS utilisant trop de memory pour charger un file XML volumineux (40 Go et plus) dans la table SQL Server

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:

  • Mode d'access aux données: file XML de la variable (mais pourrait être l'location du file XML)
  • Nom de la variable: variable qui spécifie le path du file XML sur mon ordinateur.
  • Emplacement XSD: le path vers le XSD qui définit le XML en cours de lecture.

La structure XML est simple, avec seulement 3 niveaux hiérarchiques:

  1. Elément racine avec des informations d'en-tête
  2. Un niveau définissant des collections d'objects
  3. Le niveau feuille définissant des objects individuels (chacun avec un set fixe de champs)

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