我有一个数组,其大小像2 GB(填充音频样本)。现在我想为该数组应用一个过滤器。这个滤波器产生的样本比输入源多50%。所以现在我需要创建大小为3 GB的新数组。现在我给了5 GB的内存使用。但是,如果此过滤器只能在该源阵列上运行,并且只需要该阵列中更多的空间。 问题:我可以在C#中分配一个可以调整大小的内存吗?不创建第二个内存块,然后删除第一个? 我只是想,如果PC中的内存被分成4 kB页面(或更多),那为什么C#不能(?)使用那个好功能?调整大阵列大小
调整大阵列大小
回答
如果您的过滤器可以就地工作,只是在开始时分配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;
}
您可以为阵列的每次访问添加索引检查和减法开销。在某些情况下,这也可以变得更聪明。例如,对于不需要访问扩展的部分,可以使用较快的循环,对于需要写入扩展部分的部分,可以使用较慢的版本(两个连续循环)。
Thx,但它不能在开始时分配更多内容,因为结果样本取决于用户操作。 – zgnilec 2012-08-07 09:12:31
问题:我可以在C#中分配一个可以调整大小的内存吗?不创建第二个内存块,然后删除第一个?
不,您不能在.NET中调整数组大小。如果你想增加一个数组的大小,你将不得不创建一个新的,更大的数组,并将现有数组中的所有数据复制到新数组中。
为了解决这个问题,你可以提供你自己的“数组”实现,它基于分配更小的内存块,但将其呈现为一个大的数据缓冲区。一个例子是StringBuilder
,它基于字符块的实现,每个块都是独立的Char[]
数组。
另一种选择是使用P/Invoke来访问低级别的内存管理功能,如VirtualAlloc,它允许您预先保留内存页面。您需要在64位进程中执行此操作,因为32位进程的虚拟地址空间仅为4 GB。您可能还需要使用unsafe code and pointers。
这是否可以使用.DLL中的外部代码执行? – zgnilec 2012-08-07 09:11:15
- 1. 调整阵列大小
- 2. 调整大小C#阵列
- 3. 调整3D阵列大小
- 4. 调整大小阵列
- 5. 调整矩形阵列的大小
- 6. SSRS中的可调整大小阵列
- 7. 调整二维阵列的大小
- 8. 如何在调整列大小时调整dxDataGrid的大小
- 9. Jquery可调整大小显示大小,同时调整大小
- 10. JavaFX GridPane列大小调整
- 11. CSS列大小调整
- 12. WPF DataGrid:调整列大小
- 13. TableLayout列大小调整
- 14. 调整列大小算法
- 15. TableLayout列不调整大小
- 16. WPF DataGrid列调整大小
- 17. ASP.NET Gridview列调整大小
- 18. ExtJS 4 - 调整大小后调整大小后调整大小的内部组件不会调整大小resizeHandles
- 19. 调整大小
- 20. 阵列内最大调用堆栈大小超出阵列
- 21. 调整大小DIV调整
- 22. 调整Java中的矩阵的大小
- 23. DataGridView自动调整大小,但限制最大列大小
- 24. Java:在2D阵列中动态调整列大小
- 25. 调整大小的圆形阵列,在双端队列实施
- 26. 环形阵列支持的队列调整大小/排队
- 27. NSView调整大小
- 28. 调整大小BitmapImage
- 29. 调整大小flash.media.Video
- 30. 调整大小WritableBitmap
不相关,但这是很多要存储在内存中 - 您可能会遇到其他问题,如'2GB限制' - 请参阅这里的问题和答案:http://stackoverflow.com/questions/1087982 /单个对象仍然限制到2 gb-in-size-in-clr-4-0 – Paddy 2012-08-07 08:57:12
“所以现在我需要创建一个大小为3 GB的新数组,现在我给出了5 GB的内存“。为什么不直接传输数据? – NPSF3000 2012-08-07 09:11:47
由于数据流速度非常慢: – zgnilec 2012-08-07 09:13:59