【发布时间】:2021-11-09 19:02:09
【问题描述】:
当我们使用具有 100K 行和 14 列的 CSVHelper 将 csv 文件转换为 excel 时,需要 1.5GB 的进程内存。我们需要减少内存。这是 CsvHelper 的问题,占用了那么多内存来转换文件,还是我们在这里做错了什么。有没有办法减少内存。
这是我正在使用的示例程序:
using ClosedXML.Excel;
using CsvHelper;
using System;
using System.Globalization;
using System.IO;
namespace ConsoleApp2.Conversion
{
public class CsvHelperExcelWriter
{
public void Process(string csvFilePath)
{
try
{
Stream ms = new MemoryStream();
using (var workbook = new XLWorkbook(XLEventTracking.Disabled))
{
var _worksheet = workbook.AddWorksheet("Sheet1");
using (var csv = new CsvReader(new StreamReader(csvFilePath), CultureInfo.InvariantCulture))
{
csv.Read();
if (!string.IsNullOrWhiteSpace(csv.Context.Parser.RawRecord))
{
AddHeaders(csv, _worksheet);
AddValues(csv, _worksheet);
}
}
workbook.SaveAs(ms);
ms.Position = 0;
using (FileStream fileStream = new FileStream("C:\\Projects\\POC\\SampleFile\\Excel\\100000 Sales Records with CsvHelper.xlsx", FileMode.Append, FileAccess.Write))
{
ms.CopyTo(fileStream);
fileStream.Close();
}
}
}
catch (Exception)
{
throw;
}
}
private void AddValues(CsvReader csv, IXLWorksheet _worksheet)
{
int rowNumber = 2;
while (csv.Read())
{
int cellNumber = 1;
for (var i = 0; csv.TryGetField(i, out string value); i++)
{
_worksheet.Cell(rowNumber, cellNumber).SetValue(value);
cellNumber++;
}
rowNumber++;
}
}
private void AddHeaders(CsvReader csv, IXLWorksheet _worksheet)
{
int index = 1;
_ = csv.ReadHeader();
foreach (var header in csv.HeaderRecord)
{
_worksheet.Cell(1, index).Value = header;
index++;
}
}
}
}
【问题讨论】:
-
当 workbook.SaveAs() 已经允许传递文件名时,为什么要创建 MemoryStream 只是为了将其保存到文件中。
-
您可能需要添加 ClosedXML 标签,因为您正在使用该标签
-
CsvHelper 将产生记录,因此您在读取行时只使用了一小块内存缓冲区。 ClosedXML 有几个内存消耗大的错误。与他们核实或尝试使用不同的 Excel 库。