首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET中包含超过2^31个键的大型数组的选项

.NET中包含超过2^31个键的大型数组的选项
EN

Stack Overflow用户
提问于 2010-02-13 04:42:48
回答 3查看 90关注 0票数 2

对于支持超过2^31个键的数组,是否有任何内置的it选项。这将使键类型为System.Int64而不是System.Int。虽然2^31是一个相当大的数目,但在越来越多的应用程序中,更多的密钥会有所帮助。例如,人类基因组中有超过30亿个碱基对。有什么简单的选择吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-13 04:45:16

这在.NET中是不可能的,因为每个对象有2 2GB的最大限制。即使是在64位系统中,你仍然有这个限制。

如果你真的想一次把所有这些数据都保存在内存中,你可以把你的数据分成块。您甚至可以编写一个包装类,将索引从Int64透明地映射到正确分区上的Int32索引。

你可以阅读关于BigArray的this article

票数 5
EN

Stack Overflow用户

发布于 2010-02-13 05:28:00

使用不安全代码

只适用于基本类型,如intdoubleulong等!

使用System.Runtime.InteropServices.Marshal中的AllocHGlobal手动分配内存,并使用熟悉的数组语法访问各个元素。

代码语言:javascript
复制
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索引属性。

票数 4
EN

Stack Overflow用户

发布于 2010-02-13 05:43:23

我们有相似的对象大小。我们创建了一个压缩数组,它以占用最少RAM的方式存储数据。我认为为integer这样的简单类型创建特殊的存储是很容易的。你的用户将会感谢你成千上万次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2254990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档