OutofMemory异常对象数组大小

Can*_*non -1 .net c# data-structures

我正在尝试将电子表格数据捕获到2D数组中.我正在使用VSTO.

int rc = 1048576;
int cc = 1638;

string[,] arr = new string[rc, cc];
Run Code Online (Sandbox Code Playgroud)

最后一行抛出Out of Memory异常.我想显示消息告诉用户只能捕获'X'元素.

检查MSDN并提到了16,777,216的行计数限制.无数据表的列数限制.无法找到2D阵列的限制.

我的问题不是为什么例外.我正在寻找的是,如果您正在进行VSTO开发,并且必须捕获DataTable中的工作表以执行内存中连接等,您将需要这样做:

string[,] arr = new string[rc, cc]; 
Microsoft.Office.Interop.Excel.Range selection 
arr = selection.Value as string[,]; 
Run Code Online (Sandbox Code Playgroud)

然后将该数组中的数据复制到datatable.现在,用户应该选择的元素数量的理想限制是什么.因此,当选择超出此条件时,我可以设置rowcount/columncount lmits并显示消息.

Dar*_*rov 16

我们来做数学吧.您正在尝试分配具有1048576*1638 = 1717567488元素的2D字符串数组.x64上字符串引用的大小为8个字节=>总共1717567488*8 = 13740539904个字节.这大约是13 GB的连续内存空间.CLR的单个分配的最大大小为2GB,因此您将获得OutOfMemoryException,因为无法分配单个块.

请注意,即使所有字符串都长1-2个字符,这样的字符串数量除了引用之外还需要30GB的字符串值.除了OutOfMemoryException你期望得到的还有什么?

  • +1不知道空字符串是18个字节 (3认同)
  • 是由引用存储的字符串?如果是这样,这只会分配大约6GB(仍然太大,但小于28GB) (2认同)
  • @DarinDimitrov:仍然:使用`new string [rc,cc];`你不创建`rc*cc`字符串实例.数组中的每个项目都将使用"null"进行初始化.即使*if*每个项目都是`string.Empty`它也不会因为字符串实习而改变任何东西. (2认同)