2010-04-19 5 views
3

J'essaie actuellement de charger un fichier xml légèrement volumineux dans un jeu de données. Le fichier xml fait environ 700 Mo et chaque fois que j'essaie de lire le fichier xml, il lui faut beaucoup de temps et après un certain temps, il génère une exception "out of memory".Fichiers XML volumineux dans le jeu de données (outofmemory)

DataSet ds = new DataSet(); 
ds.ReadXml(pathtofile); 

Le principal problème est qu'il est nécessaire pour moi d'utiliser ces ensembles de données (je l'utilise pour importer les données du fichier XML dans une base de données sybase (tableau foreach, foreach ligne, colonne foreach)) et que Je n'ai aucun fichier de schéma.

J'ai déjà googlé un peu, mais j'ai seulement trouvé des solutions qui ne seront pas utilisables pour moi.

Informations supplémentaires: J'utilise une base de données Sybase (ASA 9), mais mon application C# se bloque avant de gérer la base de données. L'erreur se produit après avoir lu le code XML dans l'ensemble de données et que vous voulez travailler avec le ds. J'ai déjà lu que c'est une erreur connue lors de l'utilisation de jeux de données avec un contenu important. J'ai besoin des données dans un ensemble de données au moins une fois, car j'ai besoin de l'importer dans la base de données.

Répondre

4

Vous pouvez peut dépasser cette en utilisant une surcharge de la méthode ReadXml. Passer à la place un flux tamponné, et voir si cela accélère les choses pour vous.

Voici le code:

DataSet ds = new DataSet(); 
FileStream filestream = File.OpenRead(pathtofile); 
BufferedStream buffered = new BufferedStream(filestream); 
ds.ReadXml(buffered); 

Avec la taille des données que vous parlez, l'ensemble de données lui-même peut obtenir de la mémoire limitée. Une partie du problème avec XML est qu'il peut prendre 500kb de données et le transformer en 500 Mo simplement par un mauvais choix du nom de l'élément et de la profondeur d'imbrication. Comme vous n'avez pas de schéma, vous pouvez court-circuiter la contrainte de mémoire en lisant le fichier comme ci-dessus et simplement remplacer les noms des éléments par des versions plus courtes (par exemple Remplacer <Version></Version> par <V></V> pour une réduction en octets de> 60%).

Bonne chance, et j'espère que cela aide!

+0

Test ce soir, mais ça sonne bien! –

+0

Ce travail de métod? – e1s

0

Nous aurons besoin d'un peu plus que cela, je pense. Quels programmes utilisez-vous? Quelle base de données? Est-ce que C# plante ou la base de données? Ou votre navigateur?

La solution principale serait de donner à la partie qui lance l'exception de mémoire insuffisante (je suppose que c'est votre application C#) plus de mémoire avec un paramètre. Au moins, c'est ce que je ferais si c'était un programme Java.

+0

J'ai ajouté des informations supplémentaires :) –

1

Vous devez trouver un moyen de lire paresseusement le fichier XML au lieu de tout mettre en mémoire à la fois.

cet article kb montre comment lire un élément de fichier XML par élément http://support.microsoft.com/kb/307548

Je suggère de prendre cet exemple et la modifier pour effectuer votre tâche.

Questions connexes