对于支持超过2^31个键的数组,是否有任何内置的it选项。这将使键类型为System.Int64而不是System.Int。虽然2^31是一个相当大的数目,但在越来越多的应用程序中,更多的密钥会有所帮助。例如,人类基因组中有超过30亿个碱基对。有什么简单的选择吗?
发布于 2010-02-13 04:45:16
这在.NET中是不可能的,因为每个对象有2 2GB的最大限制。即使是在64位系统中,你仍然有这个限制。
如果你真的想一次把所有这些数据都保存在内存中,你可以把你的数据分成块。您甚至可以编写一个包装类,将索引从Int64透明地映射到正确分区上的Int32索引。
你可以阅读关于BigArray的this article。
发布于 2010-02-13 05:28:00
使用不安全代码
只适用于基本类型,如int,double,ulong等!
使用System.Runtime.InteropServices.Marshal中的AllocHGlobal手动分配内存,并使用熟悉的数组语法访问各个元素。
var rand = new Random();
const ulong n = (3UL*Giga/sizeof(double));
Console.WriteLine("Allocate memory for {0} doubles.",n);
//Need to cast number of bytes to IntPtr because int is too small
var p = (double*) Marshal.AllocHGlobal((IntPtr)(n*sizeof(double)));
Console.WriteLine("Fill memory");
for (var i = 0UL; i < n; i++)
p[i] = rand.NextDouble();
Console.WriteLine("Take sum");
var s = 0.0;
for (var i = 0UL; i < n; i++)
s += p[i];
Console.WriteLine("The total is {0}.",s);
Marshal.FreeHGlobal((IntPtr) p); //<--- Important! ^^当然,p-Pointer不是一个实际的数组。您不能在需要数组或IEnumerable<double>的地方使用它。
您可以将其封装在一个整洁的类中--比如UnsafeArray --该类实现IDisposable索引并提供ulong索引属性。
发布于 2010-02-13 05:43:23
我们有相似的对象大小。我们创建了一个压缩数组,它以占用最少RAM的方式存储数据。我认为为integer这样的简单类型创建特殊的存储是很容易的。你的用户将会感谢你成千上万次。
https://stackoverflow.com/questions/2254990
复制相似问题