.Net Système.OutOfMemoryException remplir un datatable
J'ai besoin d'extraire des données à partir d'un .dbf fichier et de le transformer en xml. J'ai écrit une routine qui le fait très bien. Toutefois, maintenant que nous rencontrons très grand .les fichiers dbf - like de plus de 2GO. Et ce code génère une exception OutOfMemoryException sur ces fichiers.
Public Function GetData() As DataTable
Dim dt As New DataTable(Name)
Dim sqlcommand As String= "Select * From MyTable"
Dim cn As New OleDbConnection(myconnectionstring)
Try
cn.Open()
Dim cmd As New OleDbCommand(sqlcommand, cn)
dt.Load(cmd.ExecuteReader())
Catch ex As Exception
Throw ex
Finally
dt.Dispose()
cn.Close()
cn.Dispose()
End Try
Return dt
La chose est - si je lance ce même code sur mon ordinateur par le biais de Visual Studio en mode de débogage à l'encontre de la même 2GO .fichier dbf, aucune exception n'est levée. C'est presque comme Visual Studio gère la mémoire différemment alors l'application ne seul.
Est-il de toute façon de contourner les problèmes de mémoire? J'ai essayé à l'aide d'un DataAdapter avec des résultats similaires. Est ce comportement que je vois avec Visual Studio prévu/conception?
OriginalL'auteur brendan | 2009-09-24
Vous devez vous connecter pour publier un commentaire.
Un datatable est en mémoire, de sorte qu'il va échouer sur des fichiers volumineux ou très lente en fonction de la taille du fichier.
Vous aurez besoin d'utiliser un SqlDataReader pour lire les données d'enregistrement par enregistrement et un XmlWriter pour créer votre fichier XML.
Quelque chose comme ceci (Code non vérifié)
OriginalL'auteur Ehz
En aucune manière, vous pouvez charger un ensemble de 2 GO de base de données dans la mémoire. Vous aurez besoin de charger et de processus, les enregistrements de base de données en morceaux
De faire de la charge partielle de la base de données, vous pouvez utiliser par exemple le HAUT et ROWNUM clauses de la commande SELECT. Regardez la documentation de SQL Server pour plus de détails.
OriginalL'auteur Konamiman
Si vous voulez traiter des fichiers volumineux, pensez à DataReader sans remplissage DataSet; il ne se charge pas l'ensemble du tableau en mémoire, mais aller ligne par ligne. Et également utiliser SqlDataAdapter.Fill() au lieu de cette façon, n'oubliez pas de Jeter.
Vous n'avez pas vraiment besoin de les appeler .Close() pour la connexion, comme il est appelé lorsque vous appelez .Dispose().
PS: Vous n'avez pas de Lecteur attentif, c'est probablement pourquoi. Oui, VS.NET sera plus rapide que la GC.
OriginalL'auteur Vitaly
Pourquoi ne pas faire quelque chose de simple comme:
Ce sera juste de flux de données en ligne à la fois, de les convertir en un objet puis l'enregistrer au format xml. Ce ne sera guère utiliser toute la mémoire et devrait être très rapide.
OriginalL'auteur Nick Randell