Огромная сетка отображается на странице asp.net - PullRequest
1 голос
/ 23 августа 2010

У меня есть большая проблема.У нас есть приложение asp.net, которое имеет этот отчет, который показывает около 1000 строк на данный момент и потенциально может вырасти до 20000.Не спрашивайте меня, почему, но наш клиент не любит пейджинг и не любит фильтрацию, ему нравится видеть все на одной странице.Нашей очевидной проблемой является нагрузка, которую она помещает на сервер, с точки зрения памяти (что также может привести к сбою браузера клиента).

Мой вопрос: если я предоставлю настраиваемое настольное приложение только для этого отчета, которое может отображать тысячи и тысячи строк (с помощью веб-служб или удаленного взаимодействия), не приведет ли это к засорению сервера?На сервере рабочий процесс IIS в основном потребляет память в случае приложения asp.net, но если у меня есть это настольное приложение, работающее отдельно, вызывающее ту же базу данных на сервере приложений, решит ли это проблему с памятью?

Ответы [ 4 ]

7 голосов
/ 23 августа 2010

Попробуйте использовать сетку с отложенной загрузкой, такую ​​как jqGrid: посмотрите на третью ссылку [виртуальная прокрутка] на этой странице:

http://www.trirand.net/demoaspnet.aspx

Сетка использует ajax для загрузки только тех данных, которые видны на странице для конкретной позиции прокрутки. Никакого контроля над пгером. Хорошо, если вы должны иметь это как страницу ASP.NET.

В противном случае, предложение @ jmein сделать его загрузочным является хорошим. Просто передайте отчет в поток ответа, используя буфер соответствующего размера.

Также ознакомьтесь с использованием IEnumerable<T> и оператора yield return, чтобы минимизировать объем данных, которые вы загружаете в память для потоковой передачи в ответе.

1 голос
/ 23 августа 2010

Механизм доставки не имеет значения - вы можете сделать это в 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();
        }
    }
}
1 голос
/ 23 августа 2010

Не могли бы вы создать файл Excel из данных, чтобы вам не приходилось об этом беспокоиться?

0 голосов
/ 23 августа 2010

Если вы настроили веб-службу для возврата записей по 20 КБ, каждая из которых имеет размер 1 КБ, тогда это вызов службы размером 20 МБ.Я согласен с Дэниелом в том, что AJAX с ленивой загрузкой здесь для того, чтобы вы могли получать меньшие куски за раз.

...