Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要非常大的数组长度(大小)在C#_C#_Arrays_Size_Biginteger - Fatal编程技术网

我需要非常大的数组长度(大小)在C#

我需要非常大的数组长度(大小)在C#,c#,arrays,size,biginteger,C#,Arrays,Size,Biginteger,我正在存储结果,结果总数大于2147483647,即最大int32 我尝试了biginteger、ulong等,但它们都给了我错误 如何扩展可在其中存储>50147483647结果(双倍)的数组的大小 谢谢…BCL阵列无法做到这一点。 有人写了一个可以 然而,这并不能神奇地创造足够的内存来存储它。你不能。即使使用gcAllowVeryLargeObjects,数组中任何维度(非bytes)的最大大小也是2146435071 因此,您需要重新考虑您的设计,或者使用一种替代实现,例如锯齿阵列。C#阵

我正在存储结果,结果总数大于2147483647,即最大int32

我尝试了biginteger、ulong等,但它们都给了我错误

如何扩展可在其中存储>50147483647结果(双倍)的数组的大小


谢谢…

BCL阵列无法做到这一点。
有人写了一个可以


然而,这并不能神奇地创造足够的内存来存储它。

你不能。即使使用
gcAllowVeryLargeObjects
,数组中任何维度(非
byte
s)的最大大小也是2146435071

因此,您需要重新考虑您的设计,或者使用一种替代实现,例如锯齿阵列。

C#阵列的大小限制为
System.Int32.MaxValue

如果大于此值,请使用
列表
(其中T是您想要持有的任何值)


更多信息:

另一种可能的方法是实现您自己的BigList。首先请注意,列表是作为数组实现的。此外,您还可以在构造函数中设置列表的初始大小,因此,如果您知道它会很大,请提前获取一大块内存

然后

公共类myBigList:List
{
}
或者,可能更可取的是,使用has-a方法:

public class myBigList<T> : List<List<T>>
{

}
公共类myBigList
{
列出清单;
}

在执行此操作时,您需要重新实现索引器,以便可以使用除法和模运算在备份存储中找到正确的索引。然后可以使用BigInt作为索引。在自定义索引器中,您将把BigInt分解为两个合法大小的int。

一个2147483648
double
s数组将占用16GB内存。对一些人来说,这没什么大不了的。我有一些服务器,如果我分配一些这样的数组,它们甚至不会费心去访问页面文件。并不意味着这是个好主意

当您处理大量这样的数据时,您应该尽量减少进程对内存的影响。根据您处理数据的方式,有几种方法可以实现这一点


稀疏数组 如果您的数组是稀疏填充的(大量默认值/空值,实际有效/有用数据的百分比很小),那么稀疏数组可以大大减少内存需求。您可以编写各种实现来优化不同的分布配置文件:随机分布、分组值、任意连续组等

适用于任何类型的包含数据,包括复杂类。有一些开销,因此在填充百分比较高时,实际上可能比裸阵列更糟糕。当然,您仍将使用内存来存储实际数据

简易平锉 将数据存储在磁盘上,为文件创建一个读/写
FileStream
,并将其封装在一个包装器中,让您可以像访问内存阵列一样访问文件内容。这方面最简单的实现将为您提供合理的有用性,以便按顺序读取文件。随机读写可能会降低速度,但可以在后台进行一些缓冲,以帮助缓解速度问题

这种方法适用于任何具有静态大小的类型,包括可以复制到文件中某个字节范围或从中复制的结构。不适用于动态大小的数据,如字符串

复杂平面锉 如果您需要处理动态大小记录、稀疏数据等,那么您可能能够设计一种文件格式来优雅地处理它。同样,在这一点上,数据库可能是一个更好的选择

内存映射文件 与其他文件选项相同,但使用不同的机制访问数据。有关如何使用.NET中的内存映射文件的详细信息,请参阅

数据库存储 根据数据的性质,将其存储在数据库中可能适合您。然而,对于大量的
double
s,这不太可能是一个好的选择。在数据库中读/写数据的开销,加上存储开销——每行至少需要有一个行标识,对于一个大的记录集,可能是一个大整数(8字节整数),使数据的大小立即翻倍。加上索引、行存储等方面的开销,您可以非常轻松地增加数据的大小

数据库非常适合存储和操作复杂数据。这就是他们的目的。如果您有可变宽度的数据(字符串等),那么数据库可能是最佳选择之一。另一方面,它们通常不是处理大量非常简单数据的最佳解决方案



无论使用哪个选项,都可以创建一个与IList兼容的类来封装数据。这可以让您编写的代码不需要知道数据是如何存储的,只需要知道它是什么。

您真的有373 GB的RAM吗?听起来您需要不同的数据结构。肯定是XY问题如果我使用了那么多页面文件,是的:)您真的需要内存中的所有数据吗?为什么不将其卸载到数据库?您知道
列表
由数组支持是吗?为什么是2146435071?为什么不是2147483647?@NayukiMinase我不知道,但事实就是这样:对于编辑我答案的人来说,因为“SSD现在很普遍,随机阅读速度慢得多已经不再是一个问题了”答案并没有通过删除您更改的部分而得到改善。我的数据中心存储不完全是SSD,由于预读优化,顺序读取仍然比随机读取快。如果你有更好的答案,请自己添加。要添加到Corey的注释中,许多服务器和桌面设备仍然使用硬盘进行大容量存储,您的程序可能正在其上运行或操作其上存储的数据。你不应该对用户的硬件做出假设,除非你愿意指定它们(例如,最低规格)。
public class myBigList<T> : List<List<T>>
{

}
public class myBigList<T>
{
   List<List<T>> theList;
}