J'ai la méthode suivante pour faire une boucle dans une table, changer certaines valeurs dans chaque ligne et sauvegarder les chages dans la base de données. Pour accélérer les choses, je récupère des données dans des ensembles de 10 000 lignes. C'est une grande table avec plus de 25 millions d'enregistrements.Comment libérer la mémoire?
Le problème est que mon application ne semble pas libérer de mémoire. J'ai essayé de redéclarer la variable records
à nothing
ou d'appeler explicitement le garbage collector mais la mémoire reste là. En exécutant le profileur VS10 intégré, je peux voir que le coupable est la méthode system.linq.enumerable.tolist()
qui occupe plus de 98% de ma mémoire. Comment puis-je libérer cette mémoire après l'appel à saveChanges
?
db = New databaseEntities
Dim size = 25000000
Dim stepSize = 10000
For i = 0 to size Step stepSize
Dim sql = (From A In db.table).OrderBy(Function(A) A.Column).Skip(i).Take(stepSize)
Dim records As New List(Of table)
records = sql.ToList
For Each record In records
'do some work
Next
db.SaveChanges()
records = Nothing
GC.Collect()
Next
L'option 2 est très lente. Prend environ une minute pour détacher 10 000 enregistrements (en comparaison, leur mise à jour prend environ 2 secondes). Donc je suppose que je vais aller avec l'option 1. – Pavel