2012-02-07 5 views
1

Мы извлекаем огромные данные из базы данных SQL-сервера. Он имеет около 25000 строк с 2500 столбцами. Требование состоит в том, чтобы считывать данные и экспортировать их для распространения листа, поэтому разбиение на страницы не является выбором. Когда записи меньше, они могут вытащить данные, но когда они вырастут до размера, указанного выше, оно бросает исключение.Исключение из памяти при извлечении огромных данных из базы данных

public DataSet Exportexcel(string Username) 
{ 
    Database db = DatabaseFactory.CreateDatabase(Config); 
    DbCommand dbCommand = 
     db.GetStoredProcCommand("Sp_ExportADExcel"); 
    db.AddInParameter(dbCommand, "@Username", DbType.String, 
     Username); 
    return db.ExecuteDataSet(dbCommand); 
} 

Пожалуйста, помогите мне в решении этой проблемы.

+0

Вы можете рассчитать размер набора данных, извлекая только 1000 строк и проверяя размер возвращаемого DataSet? умножьте затем на 25 и проверьте, что на вашем сервере достаточно памяти. Остерегайтесь ASP.NET, IIS, архитектура Windows Server может иметь некоторые ограничения, поэтому, если вы нажмете на стену любого из этих ограничений, это не поможет, даже если у сервера есть 2 ТБ ОЗУ ... но сначала проверьте фактические цифры в вашем случае ... –

+0

Почему бы вам не написать запрос, чтобы ограничить количество строк, полученных из базы данных. Повторите его, пока вы не экспортируете все из них. – onatm

+2

Вам необходимо передать данные, экспортировать их в автономный DataSet, использовать DataReader для итерации по каждой строке в наборе записей, так что вы не будете глотать память за один раз. – Mantorok

ответ

3

Требование состоит в том, чтобы считывать данные и экспортировать их для распространения листа, поэтому разбиение на страницы не является выбором.

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

+0

Это последний вариант, который у меня есть, потому что в этом случае мне нужно разобрать результаты и написать один за другим, чтобы преуспеть. Теперь я непосредственно привязываю его к gridview и передаю его в таблицу – Jeeva

+0

Итак, вам нужен простой способ: вы должны упомянуть об этом. – Reniuz

+0

Не имеет смысла показывать 25000 записей в GridView сразу, на мой взгляд. У меня такое чувство, что вы делаете это только ради экспорта, чтобы преуспеть. –

0

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

Для этой цели вы можете использовать класс C# BulkCopy.

0

Если достаточно иметь данные, доступные в Excel в CSV можно использовать для массового копирования

bcp "select col1, col2, col3 from database.schema.SomeTable" queryout "c:\MyData.txt" -c -t"," -r"\n" -S ServerName -T 

Это mangnitudes быстрее и имеет небольшой след.

0

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

Ваше самое лучшее для получения таких объемов данных в шагах.

Вы можете легко прочитать данные назад по строке и экспортировать/добавить в формате CSV в файл, и все это можно сделать в хранимой процедуре.

Вы не говорите, какую базу данных вы используете, но обработка таких больших объемов данных - это то, с какими системами баз данных справляются.

Кроме того, при обработке больших количеств объектов данных в коде C# лучше всего изучить использование дженериков, так как это не налагает объект-экземпляр так же, как это делают классы и тем самым уменьшает объем памяти.

Смежные вопросы