Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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 - Fatal编程技术网

C# 调整大数组的大小

C# 调整大数组的大小,c#,arrays,C#,Arrays,我有一个2 GB大小的阵列(充满音频样本)。现在我想为该数组应用一个过滤器。这个过滤器产生的样本比输入源多50%。所以现在我需要创建一个新的数组,它的大小是3 GB。现在我使用了5GB的内存。但是如果这个过滤器只能在源阵列上运行,并且只需要在这个阵列中多一些空间。 问题:我可以在C#中分配一个可以通过创建第二个内存块,然后删除第一个内存块来调整大小的内存吗? 我只是想,如果PC的内存被分成4KB(或更多)的页面,那么为什么C#不能(?)使用这个好功能呢 问题:我可以在C#中分配一个可以通过创建第

我有一个2 GB大小的阵列(充满音频样本)。现在我想为该数组应用一个过滤器。这个过滤器产生的样本比输入源多50%。所以现在我需要创建一个新的数组,它的大小是3 GB。现在我使用了5GB的内存。但是如果这个过滤器只能在源阵列上运行,并且只需要在这个阵列中多一些空间。 问题:我可以在C#中分配一个可以通过创建第二个内存块,然后删除第一个内存块来调整大小的内存吗? 我只是想,如果PC的内存被分成4KB(或更多)的页面,那么为什么C#不能(?)使用这个好功能呢

问题:我可以在C#中分配一个可以通过创建第二个内存块,然后删除第一个内存块来调整大小的内存吗

不,不能在.NET中调整数组的大小。如果要增加数组的大小,必须创建一个新的更大的数组,并将现有数组中的所有数据复制到新数组中

为了解决这个问题,您可以提供自己的“数组”实现,该实现基于分配较小的内存块,但将其表示为一个大的数据缓冲区。这方面的一个例子是
StringBuilder
,它基于字符块的实现,每个字符块都是一个单独的
Char[]
数组


另一个选项是使用p/Invoke来访问低级内存管理函数,这样可以允许您提前保留内存页。您需要在64位进程中执行此操作,因为32位进程的虚拟地址空间只有4 GB。您可能还需要使用。

如果您的过滤器可以正常工作,只需在开始时多分配50%的空间即可。您只需要知道原始样本的实际长度

如果该代码不能始终工作,并且您不想事先消耗更多内存,则可以分配原始数组(扩展数组)的一半,并检查访问与哪个部分相关:

byte[] myOriginalArray = new byte[2GB]; // previously allocated 

byte[] myExtensionArray = new byte[1GB]; // 50% of the original
for(... my processing code of the array ...)
{
  byte value = read(index);
  ... process the index and the value here
  store(index, value);
}

byte read(int index)
{
  if(index < 2GB) return myOriginalArray[index];
  return myExtensionArray[index - 2GB];
}

void store(int index, byte value)
{
   if(index < 2GB) myOriginalArray[index] = value;
   myExtensionArray[index - 2GB] = value;
}
byte[]myOriginalArray=新字节[2GB];//以前分配的
字节[]myExtensionArray=新字节[1GB];//原价的50%
对于(…我的数组处理代码…)
{
字节值=读取(索引);
…在此处理索引和值
存储(索引、值);
}
字节读取(整数索引)
{
if(索引<2GB)返回myOriginalArray[index];
返回myExtensionArray[index-2GB];
}
无效存储(整数索引,字节值)
{
如果(索引<2GB)myOriginalArray[索引]=值;
myExtensionArray[index-2GB]=值;
}

对数组的每次访问都会增加索引检查和减法开销。在某些情况下,这也可以变得更聪明。例如,对于不需要访问扩展的部分,您可以使用更快的循环;对于需要写入扩展部分的部分,您可以使用较慢的版本(两个连续循环)。

不相关,但这需要大量存储在内存中-您可能会遇到其他问题,例如“2GB限制”-请参见此处的问题和答案:“因此,现在我需要创建一个大小为3 GB的新阵列。现在我使用了5 GB的内存。”为什么不流式处理数据呢?因为流式处理速度非常慢:(Thx,但它无法在开始时分配更多内容,因为结果样本取决于用户操作。