Я хочу обработать миллионы строк, выполнить некоторую обработку и экспортировать эти записи в файл 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
Высокое использование памяти при извлечении данных из хранимой процедуры в DataTable ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Обязательный? использование другого разделителя для хранимой процедуры в MySql
Anonymous » » в форуме JAVA - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Использование хранимой процедуры, и структура объекта - это ошибка в службе WCF
Anonymous » » в форуме C# - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Использование хранимой процедуры, и структура объекта - это ошибка в службе WCF
Anonymous » » в форуме C# - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-