Не удалось записать большой объем данных в поток
Когда я пытаюсь записать очень большой объем данных (список с 300 000 строк и более) в поток памяти, используяCsvHelperэто исключение"System.IO.IOException: поток был слишком длинным.".
Класс данных довольно большой и имеет ~ 30 свойств, следовательно, каждая запись в файле будет иметь ~ 30 столбцов.
Это фактический код написания, где генерируется исключение (кстати, этот код основан натот ответ автора CsvHelper lib):
using (var memoryStream = new MemoryStream())
{
using (var streamWriter = new StreamWriter(memoryStream, encoding ?? Encoding.ASCII))
{
var csvWriter = new CsvWriter(streamWriter, GetConfiguration(delimiter, mappingClassType, mappingActions));
csvWriter.WriteRecords(data); //data is IEnumerable<T> and has more than 300k records
streamWriter.Flush();
return memoryStream.ToArray();
}
}
Затем я сохраняю полученный массив байтов в файл.
File.WriteAllBytes(filePath, resultedBytesArray);
Обратите внимание, чтотот же код работает хорошо, когда я пишу 100 000 записей в файл (в этом случае файл имеет размер около 1 ГБ). Кстати, моя цель - записать более 600 000 записей данных.
Это релевантная часть трассировки стека, связанная с этой проблемой.
Stream was too long.|System.IO.IOException: Stream was too long.
at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
at System.IO.StreamWriter.Write(Char[] buffer, Int32 index, Int32 count)
at CsvHelper.CsvWriter.NextRecord() in C:\Users\Josh\Projects\CsvHelper\src\CsvHelper\CsvWriter.cs:line 290
at CsvHelper.CsvWriter.WriteRecords(IEnumerable records) in C:\Users\Josh\Projects\CsvHelper\src\CsvHelper\CsvWriter.cs,:line 490
at FileExport.Csv.CsvDocument.Create[T](IEnumerable`1 data, String delimiter, Encoding encoding, Type mappingClassType, IDictionary`2 mappingActions) in d:\Dev\DrugDevExport\FileExport\Csv\CsvDocument.cs:line 33
Что касается меня, то основной способ достичь своей цели и избежать этой проблемы состоит в том, чтобы разбить мой список записанных данных на несколько частей и объединить их вместе, но, возможно, есть какое-то довольно очевидное и простое решение без существенного рефакторинг кода (например, увеличение размера потока / буфера по умолчанию и т. д.)?
Также имейте в виду, что я также применил два возможных решения, чтобы предотвратить исключение объектов «Недостаточно памяти».
избавился от ограничения 2ГБ для объектов (отсюдаhttps://stackoverflow.com/a/20912869) Да, я работаю на 64-разрядной ОС с 32 ГБ ОЗУ.установить x64 "Platform target" в разделе настроек сборки (отсюдаhttps://stackoverflow.com/a/22592876)Заранее спасибо.