3

我有一个 VB.NET 应用程序,它使用 CreateObject 来使用 Excel 并将大量数据转储到其中。我们正在出现内存不足异常,此时我们的应用程序通常会达到 1GB 内存。但是我不能把所有的数字加起来。

这是将数据传递到 Excel 的方式:

    worksheet_object.Range("A1").Resize(rows, cols).Value = an_array

该应用程序大约 400mb,屏幕上的数据(数据网格),当它崩溃时,它已经使用了额外的 600mb,尽管带有 CSV 的 Excel 只有 200mb,而 CSV 只有 68mb。我意识到内存中的数组可能会更大一些,但是除非 Excel 以某种方式使用我的应用程序内存,否则 600mb 的数据如何被吞并到 Excel?

我试图通过 CreateObject 找出 Excel 是在它自己的内存空间中运行还是使用我的应用程序内存空间,完全空白。ProcessExplorer 将它们显示为单独的进程,所以我不知道该怎么想。

我们发现以 64 位而不是 32 位运行应用程序可以解决问题,但并非我们所有的客户都将拥有 64 位办公室。

所以我的问题是:那一行如何使用 600mb,有没有更好的方法将数据传递到 Excel。

4

1 回答 1

0

我敢打赌,这也需要一些时间来运行 1 行,970 万个单元!?但无论如何,有两个问题:

1:那一行如何使用600mb(我假设您的意思是MB(字节),而不是mb(位))

我想你用 970 万个细胞回答了这个问题。每个单元只有 61 个字节。我会假设你有一些字符串。每个字符串使用几个字节,单元格中的每个字符加上 2 个字节。带小数点的数字,它们占用 16 个字节.. 句号。更不用说,数组有一些大小来处理它的信息。请参阅此图表以了解数据在 VB 中占用的内容。2012 VB 数据类型我刚刚学到的一件令人惊奇的事情是因为我已经很久没有看这个图表了,那就是通过 64 位操作系统,它实际上应该占用更多的内存。幸运的是,64 位可以处理更多。

2:有没有更好的方法将数据传递到Excel。

您可以尝试使用 OLEDB ACE 驱动程序来处理您的 excel 文件。它速度更快,不需要在计算机上安装 EXCEL,那里有很大的优势。

如何使用 ADO.NET 通过 Visual Basic .NET 检索和修改 Excel 工作簿中的记录

这篇文章很旧,但仍然相关且非常有帮助。对于较新版本的 excel 的连接字符串,请尝试ConnectionStrings.com

于 2013-10-16T22:17:05.990 回答