Исключение нехватки памяти при извлечении огромных данных из БД - PullRequest
1 голос
/ 07 февраля 2012

Мы извлекаем огромные данные из базы данных sql server. Он имеет около 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);
}

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

Ответы [ 4 ]

3 голосов
/ 07 февраля 2012

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

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

0 голосов
/ 07 февраля 2012

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

Лучше всего извлекать такие объемы данных поэтапно.

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

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

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

0 голосов
/ 07 февраля 2012

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

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

Это намного быстрее, и занимает меньше места.

0 голосов
/ 07 февраля 2012

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

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

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