使用带有 ClosedXML 的大型数据表时出现 OutOfMemory 错误
OutOfMemory errors using large datatables with ClosedXML
我在添加大型数据表时创建工作表时遇到问题。我遇到了内存不足的错误。我按照建议关闭了事件跟踪以提高性能和内存消耗,但我仍然遇到这些错误。
下面是一些示例代码:
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);
}
}
问题当然是数据表很大的时候。就像成千上万的记录或更多。我尝试对大数据 table 使用另一种方法,例如使用记录数较少的临时方法,然后将它们刷新到工作表,清除数据 table 然后用新数据重新填充它。填充、冲洗、清除、重复。那或 InsertData
方法 ()
问题是每次我尝试使用可用选项写入数据 table 时,只有第一列被写入。然后降低文件我看到其他数据列,但在工作表的第一个单元格中,而不是像他们假设的那样跨越一行中的列。并且仅适用于 1 行。可能是写的最后一条记录。
有人可以帮助我了解这是如何工作的吗?
这是使用 InsertData
方法的代码片段。我使用 dataTable 作为模板创建工作表,因为它定义了所有列。然后我得到那个工作表并尝试添加到它。
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
一次读取我之前创建的 CSV 文件的 1 行。将整个文件加载到 datable 会导致内存不足错误。所以我一次读取文件 1 行,并尝试在创建工作表后添加它。
任何人都可以分享一些对此的见解吗?
谢谢
这是 ClosedXML 中的一个已知问题。目前没有解决办法。在 https://github.com/ClosedXML/ClosedXML/issues/264
查看问题
我在添加大型数据表时创建工作表时遇到问题。我遇到了内存不足的错误。我按照建议关闭了事件跟踪以提高性能和内存消耗,但我仍然遇到这些错误。
下面是一些示例代码:
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);
}
}
问题当然是数据表很大的时候。就像成千上万的记录或更多。我尝试对大数据 table 使用另一种方法,例如使用记录数较少的临时方法,然后将它们刷新到工作表,清除数据 table 然后用新数据重新填充它。填充、冲洗、清除、重复。那或 InsertData
方法 ()
问题是每次我尝试使用可用选项写入数据 table 时,只有第一列被写入。然后降低文件我看到其他数据列,但在工作表的第一个单元格中,而不是像他们假设的那样跨越一行中的列。并且仅适用于 1 行。可能是写的最后一条记录。
有人可以帮助我了解这是如何工作的吗?
这是使用 InsertData
方法的代码片段。我使用 dataTable 作为模板创建工作表,因为它定义了所有列。然后我得到那个工作表并尝试添加到它。
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
一次读取我之前创建的 CSV 文件的 1 行。将整个文件加载到 datable 会导致内存不足错误。所以我一次读取文件 1 行,并尝试在创建工作表后添加它。
任何人都可以分享一些对此的见解吗?
谢谢
这是 ClosedXML 中的一个已知问题。目前没有解决办法。在 https://github.com/ClosedXML/ClosedXML/issues/264
查看问题