【问题标题】:Gcallowverylargeobjects true is not working in *64 compiler in c#Gcallowverylargeobjects true 在 c# 的 *64 编译器中不起作用
【发布时间】:2020-01-14 09:04:16
【问题描述】:

在 Windows 窗体项目中,我将 gcallowverylargeobjects 属性设置为 true,并且编译器为 *64 位。 但是字节数组对象没有保存超过 2gb 的数据。

<Runtime>
    <gcallowverylargeobjects enabled="true">
<\Rubtime>

我的源代码示例:

int chunk = 20971520// 20mb
int totalchunk =200; // get by run time 
for(int i=0;i<totalchunk;i++)
{
    Byte[] buffer = new byte[chunk];
    File.readasync(buffer,0,buffer.length);
    Form.add(new bytearraycontent(buffer),"file","sample");// send to post method
}

【问题讨论】:

  • “在 64 位平台上”表示计算机必须是 64 位
  • 是的系统只有 64 位
  • 2097150 远不及 2GB...您输入错误了吗?
  • @matthew 20971520 是 20mb 块。在 for 循环中多次运行直到 2gb 代码工作。之后它不会。
  • @cid 错误已清除。

标签: c# arrays .net


【解决方案1】:

这是预期的行为。

gcallowverylargeobjects 使数组的大小大于 2GB,但数组中的元素数量仍限制为 ~2GB。

其中一个原因是数组通常使用带符号的 32 位整数(在 C# 中)进行索引,因此如果数组包含超过 2GB 的元素,那么它在前 2GB 元素之后将无法索引(因为那一点 int 变为负数)。

例如,如果您声明一个包含 1GB 的 double 值的数组,它将起作用 - 该数组的总大小为 8GB。

这是记录在here

在您的应用程序配置文件中使用此元素可启用大于 2 GB 的数组,但不会更改对象大小或数组大小的其他限制:

  • 数组中元素的最大数量是 UInt32.MaxValue。

  • 对于字节数组和单字节结构的数组,任何一维的最大索引为 2,147,483,591 (0x7FFFFFC7),其他类型的最大索引为 2,146,435,071 (0X7FEFFFFF)。

  • 字符串和其他非数组对象的最大尺寸不变。

【讨论】:

  • 索引的int溢出?
  • @cid 从技术上讲,您可以使用unsigned int,但为数组索引声明的类型是int。如果你使用 unsigned int,编译器不会报错,但允许的最大值实际上比 int.MaxValue 小 56。
  • 这是一个设计缺陷,可以将带符号的 int 用于索引吗? arr[-1] 没有意义(否则,如果有一天,这将被解释为在 python 中,获取最后一个元素)
  • 在声明它时使用双数组 indexoutofbound 异常抛出。 ```字节[][]缓冲区=新字节[20971520][];。 File.readasync(buffer[20971620],0,buffer.length);
  • @Cid - 鉴于 C# 8 引入了different syntax for that,这不太可能
猜你喜欢
  • 2017-07-01
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2017-04-04
  • 2023-03-06
相关资源
最近更新 更多