使用封闭的XML

时间:2016-04-05 12:56:06

标签: c# .net json json.net closedxml

我有一个包含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。 Memory utilization snapshot

0 个答案:

没有答案