2009-03-26 9 views
4

Nous avons une architecture dans laquelle nous utilisons SSIS pour extraire des données à partir de fichiers batch XML dans une base de données de transfert pour validation, avant de l'exporter en production.Quel est le plus grand fichier XML que SSIS peut extraire des données?

Nous contrôlons le format XML dans une certaine mesure, et il m'a été demandé de déterminer le nombre maximal d'enregistrements que le fichier de commandes XML devrait contenir. Basé sur le schéma XML et quelques exemples de données, je peux estimer la taille moyenne de l'enregistrement et faire quelques projections à partir de là. Toutefois, étant donné l'autre angle, j'aimerais avoir une idée des limites techniques de SSIS lorsque je traite de gros fichiers XML. Je suis conscient que SSIS va aplatir et transformer le document XML en sa propre représentation tabulaire, en mémoire, de sorte que la RAM devient un facteur limitant évident, mais dans quelle proportion?

Pouvez-vous dire quelque chose comme, SSIS nécessite quelque chose comme au moins 2,5 fois la taille du fichier que vous essayez de charger, dans la mémoire disponible? En supposant que j'ai une boîte de 32 Go dédiée à cette fonction de chargement de données, quelle est la taille de mes fichiers XML? Je suis conscient qu'il peut y avoir d'autres facteurs inclus, tels que la complexité du schéma, le nombre d'éléments imbriqués, etc. mais ce serait bien d'avoir un point de départ.

Répondre

3

Xml Source ne charge pas tout le document en mémoire, mais diffuse les données lors de leur lecture à partir du fichier XML. Donc, si vous lisez le XML et l'écrivez par ex. fichiers texte sans transformations complexes, vous avez besoin de relativement peu de mémoire. En outre, la quantité de mémoire dont vous avez besoin (après un certain seuil) cesse de croître lorsque le fichier XML se développe. Vous pouvez donc gérer des fichiers XML potentiellement illimités.

E.g. ce type a exporté tout le contenu de Wikipedia (fichier XML 20Gb): http://www.ideaexcursion.com/2009/01/26/import-wikipedia-articles-into-sql-server-with-ssis/

Bien sûr, vous ferez probablement quelque chose avec ces données, par ex. joindre plusieurs flux sortant de la source XML. En fonction de ce dont vous avez besoin, vous aurez peut-être besoin de beaucoup de mémoire, car certaines transformations conservent en mémoire tout le jeu de données, ou fonctionnent beaucoup mieux si vous avez assez de mémoire pour tout le jeu de données.

2

Ce n'est pas si simple. Tout d'abord, sachez que SSIS "aplatit" le XML de sorte qu'il y ait une sortie de la source XML pour chaque chemin à travers le XML. Un exemple trivial est que

<Parent><Child><Grandchild/></Child></Parent>

produira trois sorties et trois sorties d'erreur. Il y a pire:

<Parent><Child><Grandchild><Notes/></Grandchild><Notes/></Child><Notes/></Parent>

Cela produira des parents, des enfants, petits-enfants, parents-enfants-Grandchild Notes, parents-enfants Notes et parents-Notes sorties, les deux sorties normales et d'erreur.

Un projet sur lequel j'ai travaillé a commencé avec environ 203 sorties. J'ai été capable d'aplatir le schéma XML et de produire seulement 19 ou plus. C'est encore beaucoup en considérant que chaque sortie doit avoir son propre traitement fait.

En outre, la tâche XML ne peut pas gérer 1 Go ou plus de XML. En effet, il charge le document entier en mémoire. Essayez de faire un XmlDocument.Load d'un tel fichier et regardez ce qui se passe - c'est ce qui arrive à SSIS.

J'ai dû créer moi-même une "Source d'élément XML", qui traitait les éléments enfants de l'élément racine un à la fois. Cela m'a permis d'aplatir le XML et de gérer de gros documents (un document de test de 10 Go a fonctionné).

Il y a plus de plaisir en fonction de ce que vous voulez faire avec les données résultantes. Dans mon cas, nous devions envoyer chacune des sorties aux tables de transfert. Ce n'est pas une mauvaise chose, mais vous devez vous rendre compte que les données dans les sorties sont asynchrones. Un seul élément enfant (avec des descendants) atteindra les extrémités des chemins de sortie un peu à la fois, et vous ne saurez jamais quand tous les descendants auront fini d'être traités. Cela rend impossible le traitement transactionnel d'un élément à la fois. Au lieu de cela, SSIS ajoute une clé de substitution (je pense que c'est ce que l'on appelle) à chaque élément enfant.Il y aurait un ParentID ajouté au parent, un ChildID à l'enfant, et un ChildParentID également ajouté à l'enfant, pour faire référence au parent de l'enfant. Ceux-ci peuvent être utilisés pour "remettre l'élément en place", mais seulement après que toutes les données ont été écrites dans les tables de transfert. C'est la seule fois où vous pouvez être sûr que tout élément donné a été traité dans son intégralité - quand ils ont tous ont!

+1

La limitation de la tâche XML ne s'applique pas à l'extraction de données à l'aide de la source XML, qui ne fait pas XmlDocument.Load. – Michael

+0

Désolé; mal informé. Nous avons essayé d'utiliser la tâche XML pour aplatir le XML. Cela n'a pas fonctionné, puis a dû écrire la source personnalisée pour faire les deux. –

Questions connexes