Невозможно выполнить тестирование с вашими данными, но некоторые оптимизации могут быть добавлены в ваш цикл.
Например, не форматируйте каждое отдельное поле, а форматируйте целую строку.
Вы можете попытаться адаптировать этот код кваши данные
string separator = ";";
int pos = 0;
string format = "";
// Prepare the format mask for the whole records
foreach (string headerName in headerColumnMapping)
{
format += "\"{" + pos + "}\"" + separator;
pos++;
}
// Remove the last separator and add a newline
format = format.Substring(0, format.Length - 1) + "\r\n";
// Create the array of the field positions
var range = Enumerable.Range(0, reader.FieldCount);
// Set an initial capacity for the string builder to 10MB
// Of course this could be a waste of memory if you plan to retrieve
// small amounts of data.
StringBuilder csvString = new StringBuilder(1024*1024*10);
while (dataReader.Read())
{
var x = dataReader as IDataRecord;
// Create the array of the field values
var k = range.Select(r => x[r].ToString()).ToArray();
// Append the whole line
csvString.AppendFormat(format, k);
}
Приведенный выше код извлекает все поля из хранилища данных.Если вы хотите получить только некоторые поля, отображенные в вашем списке ordinalIndexes , просто удалите создание диапазона и используйте свой текущий код, чтобы подготовить список целых чисел для извлечения.Затем замените range.Select на ordinalIndexes.Select
Еще одна небольшая вещь, но с большим количеством выплат, - это определить емкость StringBuilder, в частности, если вы ожидаетевосстановить много данных.Если вы сразу определите достаточно большую начальную емкость, вы избежите перераспределения памяти при заполнении буфера.
Однако, если вы пытаетесь экспортировать файл CSV, я бы посоветовал взглянуть на библиотеку, которая специализируется на создании файлов CSV.Возможно, вы могли бы проверить их, если у вас есть лучшие показатели.