CsvHelper을 사용하여 매우 많은 양의 데이터 (300 000 행 이상 목록)를 메모리 스트림에 쓰려고 할 때 "System.IO.IOException 예외가 발생합니다. : 스트림이 너무 깁니다. ".많은 양의 데이터를 쓰지 못했습니다.
데이터 클래스는 크기가 커서 ~ 30 개의 속성을 가지므로 파일의 각 레코드에는 ~ 30 개의 열이 포함됩니다.
이 예외가 (이 코드 CsvHelper lib 디렉토리의 저자 that 답변에 따라하는 방식으로) 발생 실제 코드를 작성입니다
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();
}
}
는 다음 나는 파일에 결과를 바이트의 배열을 저장합니다. 나는 (이 경우 파일이 약 1GB 크기가) 파일 100 개 000 기록을 쓸 때 동일한 코드가 잘 작동
것을 File.WriteAllBytes(filePath, resultedBytesArray);
있습니다
. 그건 그렇고, 내 목표는 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
지금까지 내가 내 목표를 달성하고 문제가 몇 가지 부분에 최대 기록 된 데이터의 내 목록을 분할하고 그들을 함께 연결하는 것입니다 피할 수있는 기본적인 방법을 걱정 될 수 있지만 거기 어떤 꽤 중요한 코드 리팩토링 (예 : 기본 스트림/버퍼 크기 증가 등)없이 확실하고 쉬운 솔루션?
"메모리 부족"개체 예외를 방지하기 위해 가능한 두 가지 솔루션을 적용했습니다.
- 개체에 대한 2GB 제한이 제거되었습니다 (여기에서 https://stackoverflow.com/a/20912869). 예, 32GB RAM이있는 x64 OS에서 실행됩니다.
- 사전에
감사합니다 (여기 https://stackoverflow.com/a/22592876에서) 빌드 설정 섹션에서 64 "플랫폼 대상"을 설정합니다.
왜 당신은 MemoryStream을에 쓰고있다? 스트림을 전체적으로 메모리에 저장해야합니까? 당신은 파일에 대해 이야기하지만 MemoryStream을 사용합니다 ... FileStream으로 바꾸고 무슨 일이 일어나는 지 봅니다 ... – spender
제한된 양의 데이터를 읽고 루프에서 스트림에 쓰려고 했습니까? 즉 모든 것을 한꺼번에 볼 수는 없습니다. 아마도이 게시물에 chunking하는 비슷한 방법을 시도해 볼 수 있습니다. http://stackoverflow.com/questions/2819081/memorystream-and-large-object-heap –
@PaulZahra, 내 질문에 대해 언급했습니다. 데이터 전체를 나눠서) 작동 할 가능성이 높으며 100k 데이터 레코드로 작동하지만 분할하지 않고 다른 솔루션이 있습니까? –