Сохранение данных из SQLDataReader в FileStream с минимальным использованием памяти - PullRequest
0 голосов
/ 02 ноября 2011

Я обернул SQLDataReader как IEnumberable с помощью оператора yield.Я хотел бы использовать это для дампа в файл.Я вижу довольно тяжелое использование памяти.Интересно, есть ли у кого-нибудь идеи о том, как сделать это с минимальным или установленным использованием памяти.Я не против указать буфер, я просто хотел бы знать, каким он будет, прежде чем я использую его на ничего не подозревающем сервере.

Я использовал что-то вроде следующего:

class Program
{
    static void Main(string[] args)
    {

        var fs = File.Create("c:\\somefile.txt");
        var sw = new StreamWriter(fs);


        foreach (var asdf in Enumerable.Range(0, 500000000))
        {
            sw.WriteLine("adsfadsf");//Data from Reader

        }
        sw.Close();

    }
}

        string commandText = @"SELECT name FROM {0} WHERE name NOT LIKE '%@%'";

        SqlCommand sqlCommand = new SqlCommand(string.Format(commandText, list.TableName.SQLEncapsulate()),
                                               _connection);

        using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
        {
            while (sqlDataReader.Read())
            {
                yield return sqlDataReader["name"].ToString();
            }
        }

1 Ответ

1 голос
/ 02 ноября 2011

Некоторая большая пропускная способность памяти не является проблемой и неизбежна при обработке большого количества данных.

Данные, которые вы прочитали, будут выделены как новые объекты в куче, но они являются недолговечными объектами, так как вы просто читаете данные, записываете их, а затем выбрасываете.

Управление памятью в .NET не пытается максимально сократить использование памяти, так как наличие большого количества неиспользуемой памяти не делает компьютер быстрее. Когда вы создаете и выпускаете объекты, они на некоторое время просто остаются в куче, и сборщик мусора в конце концов их очищает.

Для приложения .NET нормально использовать много памяти, когда вы выполняете тяжелую обработку данных, и через некоторое время использование памяти снова снижается. Если есть какая-то другая часть системы, которая нуждается в памяти, сборщик мусора выполнит более агрессивную сборку, чтобы освободить как можно больше.

...