我使用OpenXML SDK 2.0生成包含大量数据的appox,appox.1000000行,我需要优化内存使用,因为我的机器速度很慢.
我想通过在运行时将部分生成的DOM树刷新到文件来解决此问题.我为数据做了自己的缓冲.例如,我有100000条记录要编写,当我在Excel工作表中添加1000行时,我想将刷新流存入文件.我通过使用方法worksheetPart.Worksheet.Save()来实现这一点.Documantation说这个方法Save():"将DOM树中的数据保存回部分.它也可以被多次调用.每次调用它时,流都会被刷新."
foreach (Record m in dataList)
{
Row contentRow = CreateContentRow(index, m); // my own method to create row content
//Append new row to sheet data.
sheetData.AppendChild(contentRow);
if (index % BufferSize == 0)
{
worksheetPart.Worksheet.Save();
}
index++;
}
Run Code Online (Sandbox Code Playgroud)
这种方法有效,因为内存使用图表已经看到形状,但不幸的是,内存使用时间增长.
有谁知道如何解决这个问题?
SpreadsheetGear for .NET可以在 74 秒内创建一个包含 1,000,000 行 x 40 列随机数(即 4000 万个单元格)的 xlsx 工作簿(包括根据随机数在内存中创建工作簿并在超频的 Intel QX 6850 和 Windows 上保存到磁盘)远景 32)。
您认为 Open XML SDK 的性能如何?
您可以在此处下载 SpreadsheetGear 的免费试用版并亲自尝试。
我将通过代码生成下面的 4000 万单元格工作簿。
免责声明:我拥有 SpreadsheetGear LLC
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SpreadsheetGear;
namespace ConsoleApplication10
{
class Program
{
static void Main(string[] args)
{
try
{
// Run once with 100 rows and then run forever with 1,000,000 rows.
for (int rows = 100; rows <= 1000000; rows = 1000000)
{
Console.Write("rows={0}, ", rows);
var startMemory = System.GC.GetTotalMemory(true);
var timer = System.Diagnostics.Stopwatch.StartNew();
var workbook = BuildWorkbook(rows);
var usedMemory = System.GC.GetTotalMemory(true) - startMemory;
Console.WriteLine("usedMemory={0}, time={1} seconds, workbook.Name={2}", usedMemory, timer.Elapsed.TotalSeconds, workbook.Name);
workbook = null;
}
}
catch (Exception e)
{
Console.WriteLine("got exception={0}", e.Message);
}
}
static IWorkbook BuildWorkbook(int rows)
{
var workbook = Factory.GetWorkbook();
var worksheet = workbook.Worksheets[0];
var values = (SpreadsheetGear.Advanced.Cells.IValues)worksheet;
Random rand = new Random();
int cols = 40;
for (int col = 0; col < cols; col++)
{
for (int row = 0; row <= rows; row++)
{
values.SetNumber(row, col, rand.NextDouble());
}
}
workbook.SaveAs(string.Format(@"c:\tmp\Rows{0}.xlsx", rows), FileFormat.OpenXMLWorkbook);
return workbook;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3844 次 |
| 最近记录: |