c# - 创建 XLSX 文件需要更多时间来记录 100000 条记录并占用最大 RAM 内存

标签 c# asp.net asp.net-mvc-4

我正在使用没有 Open XML SDK 的自定义代码创建 XLSX 文件。它适用于 50000 条 200 列的记录,最多占用 13 GB RAM。

但是当我尝试使用 100000 行和 200 列最多占用 16 GB RAM 并且从未创建 XLSX 文件并继续增加和减少 RAM 内存以及增加和减少 CPU 使用率时。

我正在将 100000 行和 200 列写入 Stream,同时将流复制到 Package Part Stream,而不拆分 XML 文件。该 XML 文件大小为 3 GB。

您能否在不使用 Open XML SDK 的情况下给出解决方案。

当我尝试使用 Open XML 时,它为单个用户处理 100000 条记录和 200 列。但当时为两个用户服务器创建 100000 条 200 列的记录时挂起。

我的自定义代码占用了更多 RAM 但没有挂起。

在下面的代码中,“CreateOpenXMLComWorkSheet_XMLWriter”方法占用了更多的 RAM 大小。

我正在使用以下代码供您引用。如果需要任何更改,请告诉我。

//Package method

    Package package = null;
    using (package = ZipPackage.Open(path, FileMode.Create))
    {

        packgPart = package.CreatePart(new Uri(relativePaths[relIndex], UriKind.Relative), contentTypes[6], CompressionOption.Maximum);
        XmlWriter xmlWriter;
        Stream stream = CreateOpenXMLComWorkSheet_XMLWriter(data, "", out xmlWriter);
        CopyStream(stream, packgPart.GetStream());
        xmlWriter.Flush();
        xmlWriter.Close();
        xmlWriter = null;
        package.Flush();
        packgPart = null;
        stream.Close();
        stream.Dispose();
        stream = null;
        relIndex++;
        GC.Collect();
        package.Close();

    }

    // CreateOpenXMLComWorkSheet method
    // Define other methods and classes here
private static Stream CreateOpenXMLComWorkSheet_XMLWriter(List<StringBuilder> rows, string sheet,out XmlWriter xmlWriter)

{

    string[]  cols;

    XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
             xmlWriterSettings.NewLineHandling = NewLineHandling.None;
             xmlWriterSettings.Indent = false;
             xmlWriter = null;
             MemoryStream stream = new MemoryStream();
             string nameSpace = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
             xmlWriter = XmlWriter.Create(stream,xmlWriterSettings);

    xmlWriter.WriteStartElement("x","worksheet",nameSpace);
    xmlWriter.WriteStartElement("x","sheetData",nameSpace);


    for (m = 0; m < rows.Count; m++)
    {

        xmlWriter.WriteStartElement("x","row",nameSpace);

        cols = rows[m].ToString().Split(new string[] { univDelimiter }, StringSplitOptions.None);


        for (int i = 1; i <= cols.Length; i++)
         {
             cellValue = cols[i - 1];
             if (double.TryParse(cellValue,out dVal))
             {
                 dataType = "n";
             }
             else
             {
                 dataType = "str";
             }
             xmlWriter.WriteStartElement("x","c",nameSpace);
             xmlWriter.WriteAttributeString("s", "13");
             xmlWriter.WriteAttributeString("t", dataType);
             xmlWriter.WriteStartElement("x", "v",nameSpace);
             xmlWriter.WriteValue(cellValue);
             xmlWriter.WriteEndElement();
             xmlWriter.WriteEndElement();
         }

        xmlWriter.WriteEndElement();

        rows[m] = null;

    }
    xmlWriter.WriteEndElement();
    xmlWriter.WriteEndElement();
    xmlWriter.Flush();
    stream.Position = 0;
    return stream;
}

//CopyStream method
private static void CopyStream(Stream source, Stream target)
{
     const int bufSize = 0x1000;
     byte[] buf = new byte[bufSize];
     int bytesRead = 0;
     while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
        target.Write(buf, 0, bytesRead);
}

最佳答案

看来您在编写文件时采用了错误的方法,open xml sdk 是创建具有大量数据的 excel 的好工具。 我认为您需要采用类似 SAX 的方法,它使用 xmlreader 和 writer 的组合而不会耗尽内存。

看看这个符合您特定要求的精彩博客。

https://blogs.msdn.microsoft.com/brian_jones/2010/06/22/writing-large-excel-files-with-the-open-xml-sdk/

关于c# - 创建 XLSX 文件需要更多时间来记录 100000 条记录并占用最大 RAM 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39385125/

相关文章:

c# - 使用 SQL #tempdb 将 databind() 绑定(bind)到 ListBox

c# - 将按下的任何键绑定(bind)到 VM WPF 中的命令

c# - DX TreeList - 如何更改某些节点的颜色

c# - 如何在 C# 中进行非阻塞套接字调用以确定连接状态?

ASP.NET MVC : When to use custom HTML helper methods vs Html. RenderAction吗?

asp.net - App_Data - Web 应用程序的数据目录。它有多安全?

c# - 将 JSON 和输入文件传回 Controller MVC 4

c# - ASP.NET MVC4 重定向到登录页面

c# - 突然我的 web-api 项目找不到对 System.Web.Mvc 的引用,编译正常但运​​行时错误

c# - 如何在 C# 中终止线程?