你如何创建一个大型阵列?

Mas*_*low 1 arrays f# c#-to-f# gcallowverylargeobjects

特定

// r is a System.Data.IDataRecord
var blob = new byte[(r.GetBytes(0, 0, null, 0, int.MaxValue))];
r.GetBytes(0, 0, blob, 0, blob.Length);
Run Code Online (Sandbox Code Playgroud)

r.GetBytes(...)回报Int64 由于Array.zeroCreateArray.init采取Int32如何创建一个空的数组,它是可能大于Int32.MaxValue

Tom*_*cek 6

在.NET 4.5及更高版本中,gcAllowVeryLargeObjects 配置元素允许您创建大于2GB的单个对象,但即使这样也不会更改数组中元素数量的硬限制.引用备注部分:

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

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

我不完全确定为什么UInt32而不是Int32(你可以创建最小索引的数组Int32.MinValue,但我不确定你能用它做多少:-)).

但是,使用该gcAllowVeryLargeObjects参数,您可以通过创建包含多个值的结构数组来创建非常大的数组 - 这将分配超过2GB的连续内存块:

[<Struct>]
type Quadruple<'T>(v1:'T, v2:'T, v3:'T, v4:'T) = 
  member x.V1 = v1
  member x.V2 = v2
  member x.V3 = v3
  member x.V4 = v4

let qa : Quadruple<byte>[] = Array.zeroCreate 10 
Run Code Online (Sandbox Code Playgroud)

我认为这不是特别实用,但这是一种可能性.实际上,将数据拆分为数组数组似乎更容易.当单个阵列大约2GB时,一级间接可能不会导致太多开销.