我正在寻找在内存中存储和管理大字节数组的最有效方法。我需要从数组中的任何位置插入和删除字节。
起初,我认为常规阵列是最好的。
byte[] buffer = new byte[ArraySize];
这将允许我访问数组中的任何字节。我也可以调整阵列的大小。但是,似乎没有任何内置支持转移或移动数组中的项目。
一个选择是有一个循环来逐个移动项目,但在C#中听起来非常低效。另一个选择是创建一个新数组并将字节复制到正确的位置,但这需要复制数组中的所有数据。
有没有更好的选择?
答案 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
非常大(兆字节的数据)