表示大字节数组的最佳方式

时间:2012-11-12 21:28:25

标签: c# arrays

我正在寻找在内存中存储和管理大字节数组的最有效方法。我需要从数组中的任何位置插入和删除字节。

起初,我认为常规阵列是最好的。

byte[] buffer = new byte[ArraySize];

这将允许我访问数组中的任何字节。我也可以调整阵列的大小。但是,似乎没有任何内置支持转移或移动数组中的项目。

一个选择是有一个循环来逐个移动项目,但在C#中听起来非常低效。另一个选择是创建一个新数组并将字节复制到正确的位置,但这需要复制数组中的所有数据。

有没有更好的选择?

2 个答案:

答案 0 :(得分:2)

实际上,我刚刚找到Buffer Class,这似乎是我需要的理想选择。

看起来BlockCopy方法会阻止复制一堆项目并支持在同一个数组中进行复制,甚至可以正确处理重叠项目。

答案 1 :(得分:1)

我认为在这种情况下最好的选择是常规数组和列表之间的混合。这只适用于兆字节大小的数组。

所以你可以这样做:

List<byte[]> buffer;

让列表中的每个元素只占一大块数据(比如64K或者小而且易于管理)

它需要相当多的自定义代码,但是当必须在大型数组中移位数据时,肯定是最快的选择。

此外,如果你进行的字节移动比其他任何东西都多,LinkedList<T>可能会更好(但除了特定的一组案例之外,它的所有内容都很糟糕)

为了阐明为什么这比数组更正确,考虑在数组的开头插入1个字节。您必须分配另一个数组(双内存消耗),然后在插入新字节后将每个字节复制到新数组,然后释放旧数组(可能的堆损坏取决于大小)

现在考虑使用列表的此方法。

如果必须插入大量字节,则可能需要在buffer列表的开头插入。这是一个O(n)操作,因此这个操作的结束效率是O(n / CHUNK_SIZE)

或者,如果您只需要插入一个字节,您就可以获取列表的第一个元素并正常复制数组。然后,速度为O(CHUNK_SIZE),这并不可怕,特别是如果比较的n非常大(兆字节的数据)