Une Exception de type 'System.OutOfMemoryException " a été levée. C# lors de l'utilisation de IDataReader

J'ai une application dans laquelle je dois obtenir une grande quantité de données à partir de DB.
Car elle n'est pas d'obtenir toutes ces lignes (c'est près de 2 000 000 de lignes...), je l'ai découpé dans des pauses, et je lance à chaque fois que la requête sql et obtenir seulement 200 000 lignes à chaque fois.

- Je utiliser DataTable à qui je entrer toutes les données (sens - tous les 2 000 000 de lignes devrait être là).

Les quelques premières pistes sont très bien. Puis il échoue avec l'exception OutOfMemoryException.

Mon code fonctionne comme suit:

private static void RunQueryAndAddToDT(string sql, string lastRowID, SqlConnection conn, DataTable dt, int prevRowCount)
    {
        if (string.IsNullOrEmpty(sql))
        {
            sql = generateSqlQuery(lastRowID);
        }

        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }

        using (IDbCommand cmd2 = conn.CreateCommand())
        {
            cmd2.CommandType = CommandType.Text;
            cmd2.CommandText = sql;
            cmd2.CommandTimeout = 0;

            using (IDataReader reader = cmd2.ExecuteReader())
            {
                while (reader.Read())
                {
                    DataRow row = dt.NewRow();
                    row["RowID"] = reader["RowID"].ToString();
                    row["MyCol"] = reader["MyCol"].ToString();
                    ... //In one of these rows it returns the exception.

                    dt.Rows.Add(row);
                }
            }
        }

        if (conn != null)
        {
            conn.Close();
        }

        if (dt.Rows.Count > prevRowCount)
        {
            lastRowID = dt.Rows[dt.Rows.Count - 1]["RowID"].ToString();
            sql = string.Empty;
            RunQueryAndAddToDT(sql, lastRowID, conn, dt, dt.Rows.Count);
        }
    }

Il me semble que si le lecteur garde la collecte de lignes, et c'est pourquoi Il déclenche une exception seulement dans la deuxième ou troisième ronde.

Ne pas le nettoyer à l'Aide de la mémoire de son fait?
Ce qui peut résoudre mon problème?

Note: je dois expliquer - je n'ai pas d'autre choix que d'obtenir toutes ces lignes à la datatable, Depuis que j'ai quelques manipulations plus tard, et l'ordre des lignes est important, et je ne peux pas diviser parce que parfois, je dois prendre les données de certaines lignes et le mettre en une seule ligne et ainsi de suite et ainsi de suite, donc je ne peux pas l'abandonner.

Grâce.

Juste un commentaire que si les données doubles, ou triples dans la taille. Il doit y avoir un écart de seulement reprendre une partie des données, si non, on peut exécuter beaucoup d'ennuis par la suite.
Chargement de 2M lignes est assez rare - la plupart du temps, l'idée est de minimiser la quantité de données chargées. Et si vous avez besoin de 2M lignes, DataTable peut-être pas le meilleur modèle de toute façon (DataTable a la verticale). J'avais de le charger dans un POCO modèle, personnellement.

OriginalL'auteur DA_Prog | 2012-12-24