Экспорт больших объемов данных - PullRequest
5 голосов
/ 07 октября 2011

Вот моя проблема.

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

Эти отчеты могут содержать несколько лет.данных (более 1 млн. строк), мы позволяем нашим клиентам загружать данные в соответствии с диапазоном дат, но мы начали ограничивать продолжительность просмотра данных, чтобы предотвратить проблемы с производительностью на нашем сайте.Тем не менее, данные по-прежнему становятся достаточно большими даже для небольшого диапазона дат, теперь, когда они расширяются, и если они загружают слишком много, наша память переполняется несколькими гигабайтами и исчерпывает память.

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

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

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

Идеи?Мысли?Предложения?

Пример кода:


// Get Data

SqlConnection con = new SqlConnection();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter da;
DataSet ds = new DataSet();

con.ConnectionString = "MyConnectionString";
con.Open();

cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "MyStoredProc";
da = new SqlDataAdapter(cmd);
da.Fill(ds);

con.Close();

StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
DataGrid dg = new DataGrid();
dg.DataSource = ds.Tables[0];
dg.DataBind();
dg.RenderControl(htw);

Response.ClearContent();
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment;filename=Report.xls");
Response.Write(sw.ToString());
Response.End();

Когда я запускаю это с моими данными .. что составляет приблизительно 800 Кбайт, у меня всплески памяти, и я получаю ошибку нехватки памяти и делаю вещихуже .. он всегда тянет в RenderControl, пока не закончится

Ответы [ 4 ]

2 голосов
/ 07 октября 2011

Я предполагаю, что данные поступают из серверной базы данных.В этом случае пользователь не должен ждать завершения этой операции.Это плохой дизайн пользовательского интерфейса, особенно когда объем памяти может увеличиться до 4 ГБ.

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

Вы позволяете пользователю нажимать кнопку загрузки для поиска / файла, и он добавляется в очередь в таблице базы данных.Существует процесс db / .net, который обрабатывает эти задания и генерирует файл в правильном формате на сервере.Возможно, можно повторно использовать файл для многих пользователей, если данные совпадают и вы используете надлежащие соглашения об именах.Затем пользователь должен перейти на страницу очереди загрузки и просмотреть все свои загрузки, которые он запланировал.После завершения он сможет загрузить файл.

, если у вас есть требование, которое не позволяет вам сделать это, пожалуйста, оставьте комментарий, объясняющий его.

1 голос
/ 07 октября 2011

Хорошо, мы идем:

  • НЕ ИСПОЛЬЗУЙТЕ ТАБЛИЦУ
  • НЕ ИСПОЛЬЗУЙТЕ ДАННЫЕ

Закончено.

Получитьчитатель данных, пишите HTML на ходу - вы никогда не будете хранить все данные в памяти.Ваш подход никогда не будет масштабироваться.

0 голосов
/ 10 мая 2016

Решено !!!

С той же проблемой столкнулся я, когда работал над экспортом больших объемов данных в Excel.

решение: вы можете использовать open XMl dll для решения вашей проблемы. Используя эту DLL, вы можете экспортировать большой объем данных в Excel, и потребление памяти также будет меньше.

больше информации вы можете получить здесь https://msdn.microsoft.com/en-us/library/office/hh180830(v=office.14).aspx

0 голосов
/ 07 октября 2011

Можете ли вы переписать хранимую процедуру для разбивки на страницы и перебрать набор данных?Затем переписайте выходную часть для потоковой передачи файла, вместо того, чтобы выводить все сразу (текущий метод в основном просто записывает таблицу HTML).

Пейджинг данных не позволит процессу загрузки сохранить все это.данные в памяти

...