你如何创建一个大数组?
how do you create a large array?
给定
// 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);
和r.GetBytes(...)
returns Int64
由于 Array.zeroCreate
和 Array.init
采用 Int32
如何创建一个可能大于 Int32.MaxValue
的空数组?
你不能。 .NET 上一维数组的最大长度为 System.Int32.MaxValue
。当值大于此限制时,您的 C# 代码会引发 OverflowException
。等效的 F# 代码是:
let blob =
let length = r.GetBytes(0, 0, null, 0, Int32.MaxValue)
if length > int64(Int32.MaxValue) then
raise (OverflowException())
else
Array.zeroCreate<byte>(int32(length))
在 .NET 4.5 和更新版本中,gcAllowVeryLargeObjects
configuration element 允许您创建大于 2GB 的单个对象,但即使这样也不会改变元素数量的硬性限制大批。引用备注部分:
The maximum number of elements in an array is UInt32.MaxValue.
The maximum index in any single dimension is 2,147,483,591 (0x7FFFFFC7) for byte arrays and arrays of single-byte structures, and 2,146,435,071 (0X7FEFFFFF) for other types.
我不完全确定为什么 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
我认为这不是特别实用,但这是一种可能性。实际上,将数据拆分为数组数组似乎更容易。当单个数组大约为 2GB 时,一级间接可能不会造成太多开销。
给定
// 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);
和r.GetBytes(...)
returns Int64
由于 Array.zeroCreate
和 Array.init
采用 Int32
如何创建一个可能大于 Int32.MaxValue
的空数组?
你不能。 .NET 上一维数组的最大长度为 System.Int32.MaxValue
。当值大于此限制时,您的 C# 代码会引发 OverflowException
。等效的 F# 代码是:
let blob =
let length = r.GetBytes(0, 0, null, 0, Int32.MaxValue)
if length > int64(Int32.MaxValue) then
raise (OverflowException())
else
Array.zeroCreate<byte>(int32(length))
在 .NET 4.5 和更新版本中,gcAllowVeryLargeObjects
configuration element 允许您创建大于 2GB 的单个对象,但即使这样也不会改变元素数量的硬性限制大批。引用备注部分:
The maximum number of elements in an array is UInt32.MaxValue.
The maximum index in any single dimension is 2,147,483,591 (0x7FFFFFC7) for byte arrays and arrays of single-byte structures, and 2,146,435,071 (0X7FEFFFFF) for other types.
我不完全确定为什么 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
我认为这不是特别实用,但这是一种可能性。实际上,将数据拆分为数组数组似乎更容易。当单个数组大约为 2GB 时,一级间接可能不会造成太多开销。