使用带有ClosedXML的大型数据表的OutOfMemory错误

添加大型数据表时遇到问题,请创build工作表。 我正在摆脱内存错误。 我build议closures事件跟踪,以提高性能和内存消耗,但我仍然遇到这些错误。

这是一些示例代码:

public void SaveWorkBook(string xlFileName, DataSet dataSet) { using (var xlWorkBook = new XLWorkbook(XLEventTracking.Disabled)) { xlWorkBook.AddWorksheet(dataSet); xlWorkBook.SaveAs(xlFileName); } } public void SaveWorkBook(string xlFileName, params DataTable[] dataTables) { using (var xlWorkBook = new XLWorkbook(XLEventTracking.Disabled)) { foreach (var dataTable in dataTables) xlWorkBook.AddWorksheet(dataTable); xlWorkBook.SaveAs(xlFileName); } } 

当然问题是数据表是巨大的。 像成千上万的logging或更多。 我试图使用一种替代方法来处理大数据表,比如使用一个具有较小logging数的临时数据表,然后将它们刷新到Worksheet,清除数据表,然后用新数据重新填充数据表。 填充,冲洗,清除,重复。 那或者InsertData方法()

问题是,每次我尝试使用可用选项写入数据表时,只有第一列正在写入。 然后降低文件,我看到其他列的数据,但在工作表的第一个单元格,而不是像他们所想的那样在一行中跨越列。 而且只有一排。 可能是写的最后一个logging。

有人能帮我理解这是如何工作的吗?

这是一个使用InsertData方法的代码片段。 我使用dataTable作为模板创build工作表,因为它定义了所有的列。 然后我得到该工作表,并尝试添加到它。

 public void SaveWorkBook(string xlFileName, DataTable dataTable, string dataFileName, char delimitor) { using (var xlWorkBook = new XLWorkbook(XLEventTracking.Disabled)) { xlWorkBook.AddWorksheet(dataTable); var workSheet = xlWorkBook.Worksheets.First(ws => ws.Name == dataTable.TableName); using (var sr = new StreamReader(dataFileName)) { var rowIndex = 1; sr.ReadLine(); while (!sr.EndOfStream) { var line = sr.ReadLine() + string.Empty; workSheet.Cell(++rowIndex, 1).InsertData(line.Split(delimitor)); } } xlWorkBook.SaveAs(xlFileName); } } 

正如你所看到的,我正在使用StreamReader来读取前面创build的CSV文件的每行一行。 将整个文件加载到数据库中会导致内存不足错误。 所以我一次读取文件1行,并尝试在创build工作表后添加它。

任何人都可以分享一些洞察力呢?

谢谢

这是ClosedXML中的一个已知问题。 目前没有解决scheme。 请参阅https://github.com/ClosedXML/ClosedXML/issues/264上的问题