我有一个包含100,000行和20列的excel文件。我使用ClosedXml获取记录,然后使用Json.Net库将其转换为JSON。然而,似乎我的记忆消耗正在增加很多。它在运行代码时大约增加了2.5GB。以下是我的代码
public class Reader : IReader
{
public JObject Convert(string excelFile, string sheetName, List<string> columns)
{
var workbook = new XLWorkbook(excelFile, XLEventTracking.Disabled);
var worksheet = workbook.Worksheet(sheetName);
var headers = worksheet.FirstRowUsed();
ValidateColumns(headers, columns);
var itemRow = headers.RowBelow();
var ds = new JObject();
var rowCount = 1;
while (!itemRow.Cell(1).IsEmpty())
{
rowCount++;
var jRow = ConvertRowToArray(itemRow, columns);
var key = CreateKey(itemRow);
if (ds[key] != null)
((JArray)ds[key]).Add(jRow);
else
ds.Add(key, new JArray(jRow));
itemRow = itemRow.RowBelow();
jRow = null;
key = null;
}
return ds;
}
private JObject ConvertRowToArray(IXLRow row, List<string> columns)
{
var jRow = new JObject();
for (var iterator = 1; iterator <= columns.Count; iterator++)
{
var jVal = new JObject();
jVal.Add("Value", row.Cell(iterator).Value.ToString());
jVal.Add("Error", new JArray());
jRow.Add(columns[iterator - 1], jVal);
jVal = null;
}
return jRow;
}
private string CreateKey(IXLRow row)
{
return string.Format("{0}-{1}-{2}", row.Cell(2).Value.ToString(), row.Cell(5).Value.ToString(), row.Cell(6).Value.ToString());
}
private void ValidateColumns(IXLRow row, List<string> columns)
{
for (var index = 0; index < columns.Count; index++)
{
if (columns[index] != row.Cell(index + 1).Value.ToString())
throw new FormatException("Column Mismatch");
}
}
}
转换是这样的:
| Col1 | Col2 | Col3 |
| V1 | V2 | V3 |
应该转移到:
{
"items": {
"Value": [
{
"Col1": {
"Value": "V1",
"Error": [ ]
},
"Col2": {
"Value": "V2",
"Error": [ ]
},
"Col3": {
"Value": "V3",
"Error": [ ]
}
}
]
}
}
转换小的excel文件没有问题,但是在使用更大的文件时我遇到了高内存利用率问题。我是Json.Net的新手,所以不确定任何减少内存消耗的技巧或最佳实践。任何帮助将不胜感激。
更新
从VS2015诊断工具看起来,罪魁祸首是Newtonsoft.Json.Linq.JProperty和JArray。