在 C# 中创建大型(巨大)数组
Posted
技术标签:
【中文标题】在 C# 中创建大型(巨大)数组【英文标题】:Large (huge) array creating in C# 【发布时间】:2017-07-08 18:09:06 【问题描述】:我正在与大型阵列的问题作斗争。我需要阅读大量 csv 文件并使用它们(制作表格并保存它们)。我是这样试试的
String[,,] pole = new string[5000, 10251, 100];
...
String[] proz = File.ReadAllText("@/../../History/201" + r + "-" + m1 + m2 + "-" + d1 + d2 + "_00/variables_ens.csv").Split(';');
for (int k = 0; k < 10251; k++)
int l = k / 99;
int lk = l * 99;
int b = k - lk;
pole[n, l, b] = proz[k];
但在第一行
String[,,] pole = new string[5000, 10251, 100];
它说超出范围异常,但我确实需要那么多空间。当我写
String[,,] pole = new string[100, 10251, 100];
它有效,但仅适用于其中的数百个文件。 有什么建议吗?
【问题讨论】:
您可以使用 List 而不是数组,它更灵活。您应该不需要它,不是每个 CSV 都具有相同数量的内容。所以列表可以增长并且没有硬编码的索引范围。 好吧,如果你说的是“IndexOutOfRangeException”中的情况,那不是大小问题,你访问的是不存在的元素,因此你应该使用动态数据结构,也许是 List 将您的项目重建为 x64,然后重试。如果这不起作用,请获取更多内存。n
变量从何而来?在您尝试使用它来索引您的数组之前,它不会出现在您的代码中的任何位置。由于更改数组的第一个维度会使错误消失,因此您使用 n
的方式很可能是问题的根源,而您没有向我们提供任何相关信息。
另外请注意,尺寸为 5000、10251、100 的数组在完全为空时会占用 20 GB 的内存。我认为你需要想出一个更好的策略来解决这个问题。
【参考方案1】:
在您的声明中,您声明了一个由 5000 * 10251 * 100 个元素组成的数组。这是 5,125,500,000 个元素,这是一个超出单个块中内存分配范围的数字(至少在 32 位系统中)。您可以将数据拆分为 2 或 3 个不同的数组,也可以使用动态分配结构,如 List。
【讨论】:
【参考方案2】:好吧,我认为您需要重新考虑您的整个策略并实施流媒体 vie IEnumerable<T>
和 File.ReadLines
。
我没有足够的元素来完全理解您通过当前实现尝试实现的目标,但我很确定您尝试操作的数据量太大而无法处理记忆。
你需要做什么?你在处理什么数据? 5000 个文件,每个文件 1025100 行?每个文件的大小都一样?您真的、真的需要一次加载所有内容吗?
这个问题的答案应该为您指明正确的方向。我想说您需要使用流式传输以更易于管理的形式(如数据库)有效地加载数据。
【讨论】:
以上是关于在 C# 中创建大型(巨大)数组的主要内容,如果未能解决你的问题,请参考以下文章