我有一个VB.NET应用程序,它使用CreateObject来使用Excel并将大量数据转储到其中。我们正在消耗内存异常,我们的应用程序通常会在此时达到1GB的内存。但是我无法将所有数字加起来。
这是将数据传递给Excel的方式:
worksheet_object.Range("A1").Resize(rows, cols).Value = an_array
应用程序大约400mb,屏幕上有数据(datagrid),当它崩溃时,它已经使用了额外的600mb,尽管带有CSV的Excel只有200mb而CSV只有68mb。我意识到内存中的数组可能会稍微大些但是600mb如何将数据传递给Excel,除非Excel以某种方式使用我的应用程序内存?
我试图找出Excel通过CreateObject在自己的内存空间中运行还是使用我的应用程序内存空间,画了一个完整的空白。 ProcessExplorer将它们显示为单独的进程,因此我不知道该怎么想。
我们发现以64位而不是32位运行应用程序解决了这个问题,但并非所有客户都拥有64位办公室。
所以我的问题是:这一行如何使用600mb并且有更好的方法将数据传递给Excel。
答案 0 :(得分:0)
我敢打赌,这需要一些时间来运行1行,9.7M单元!?但无论如何,有两个问题:
1:一行如何使用600mb(我假设你的意思是MB(Byte),而不是mb(bit))
我想你用9.7M电池回答了这个问题。这个单元只有61字节。我会假设你有一些字符串。每个字符串使用几个字节,加上单元格中每个字符的2个字节。带小数点的数字,它们占用16个字节..周期。更不用说,数组有一些大小,以处理它的信息。请参阅此图表,了解VB中的数据占用情况。 2012 VB Data Types我刚刚学到的一件令人惊奇的事情,因为我没有长时间看这个图表,那就是去64位操作系统,实际上它应该占用更多的内存。幸运的是,64位可以处理更多。
2:有没有更好的方法将数据传递给Excel。
您可以尝试使用OLEDB ACE驱动程序来处理excel文件。它更快,不需要在计算机上安装EXCEL,那里有很大的优势。
How To Use ADO.NET to Retrieve and Modify Records in an Excel Workbook With Visual Basic .NET
这篇文章很老但仍然相关且非常有帮助。对于较新版本的Excel的连接字符串,请尝试ConnectionStrings.com