Механизм доставки не имеет значения - вы можете сделать это в asp.net или в настольном приложении, не потребляя смешного объема памяти.
Общий принцип заключается в том, что вам нужен доступ к данным как stream вместо одновременной загрузки в память.Когда вы обрабатываете потоковые данные, вы имеете дело только с подмножеством ваших результатов в любой момент времени.Когда вы переходите к следующей записи в потоке, вы сигнализируете, что вы закончили с предыдущей записью, поэтому среда выполнения .NET может восстановить используемую память и управлять ею.
В C # это означает использование DataReader
(обычно получается через IDbCommand.ExecuteReader
).Типичный фрагмент, который записывает непосредственно в поток HttpResponse
с использованием устройства чтения данных, может выглядеть следующим образом (хотя вы также можете привязать к ним данные):
using(IDataReader reader = dataAccessLayer.GetData()) {
if (! reader.IsClosed) {
// Send writes to the client immediately
// reader.Read advances the reader to the next record in the
// result set and discards the current record
while (reader.Read()) {
// Do something with the record - this just writes the first
// column to the response stream.
Response.Write(reader[0]);
// Send the content to the client immediately, even if the content
// is buffered. The only data in memory at any given time is the
// row you're working on.
Response.Flush();
}
}
}