Высокое использование памяти при извлечении данных из хранимой процедуры в DataTableC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Высокое использование памяти при извлечении данных из хранимой процедуры в DataTable

Сообщение Anonymous »

Я хочу обработать миллионы строк, выполнить некоторую обработку и экспортировать эти записи в файл Excel. Когда я извлекаю записи и заполняю их в DataTable, он использует очень большой объем памяти — от 8 до 10 ГБ. Результат моего SQL-запроса содержит около 300 столбцов.
Я пробовал использовать пакетный режим, а также пробовал использовать SqlDataReader. С пакетной обработкой и без нее она занимает почти одинаковую память, а после использования SqlDataReader она не влияет на память. Ниже приведен мой текущий код. Есть ли способ остановить такое интенсивное использование?
Извлекайте записи пакетами по 10 000 строк:
DataTable dt = new DataTable();

for (int i = 0; i = 10000); j++)
{
dt = null;
dt = _dataService.SqlExecuteDT(data);
startRow = startRow + 10000;
}
}

Код для вызова хранимой процедуры и заполнения таблицы данных:
public static DataTable SqlExecuteDT(string spname, Dictionary parameters, DBName dBName = DBName.DBCONN)
{
using (SqlConnection conn = new SqlConnection(DBConnection.GetConnectionString(dBName)))
{
using (SqlCommand cmd = new SqlCommand(spname, conn))
{
cmd.CommandTimeout = Timeout;
cmd.CommandType = System.Data.CommandType.StoredProcedure;

if (parameters != null)
{
foreach (KeyValuePair kvp in parameters)
cmd.Parameters.AddWithValue(kvp.Key, kvp.Value ?? DBNull.Value);
}

conn.Open();

// Use a forward-only, read-only data reader for memory efficiency
using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
// Retrieve column schema
DataTable schemaTable = reader.GetSchemaTable();

// Create DataTable to hold the data
DataTable dataTable = new DataTable();

// Add columns to DataTable based on schema
foreach (DataRow row in schemaTable.Rows)
{
string columnName = row["ColumnName"].ToString();
Type dataType = (Type)row["DataType"];
dataTable.Columns.Add(columnName, dataType);
}

// Populate DataTable with data
while (reader.Read())
{
DataRow dataRow = dataTable.NewRow();

for (int i = 0; i < reader.FieldCount; i++)
{
dataRow = reader;
}

dataTable.Rows.Add(dataRow);
}

return dataTable;
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/782 ... -datatable
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»