當我試圖用CsvHelper向存儲器流寫入非常大量的數據(具有300 000行以上的列表)時,它會拋出異常「System.IO.IOException :流太長了。「。無法寫入大量的數據流
數據類相當大,具有〜30個屬性,因此文件中的每個記錄都會有〜30列。
這是例外拋出(此代碼是基於that答案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);
請注意,相同的代碼效果很好,當我寫的10萬條記錄到文件(在這種情況下,文件大小爲1GB左右)。順便說一句,我的目標是寫出超過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操作系統上運行。
- 成立64「平臺目標」在構建設置部分(從這裏https://stackoverflow.com/a/22592876)提前
感謝。
你爲什麼寫一個MemoryStream?你是否需要完全在內存中存儲流?你談論文件,但使用MemoryStream ...用FileStream替換它,看看會發生什麼... – spender
您是否嘗試過讀取有限的數據並將其寫入循環中的流?即不是一次全部。你也許可以嘗試類似的方法分塊這篇文章http://stackoverflow.com/questions/2819081/memorystream-and-large-object-heap –
@PaulZahra,我在我的問題中提到的那個,這樣(通過分裂了大量的數據)它很可能會工作,並且它現在可以處理10萬條數據記錄,但是有沒有其他解決方案沒有分裂? –