我正在寻找在内存中存储和管理大字节数组的最有效方法。我将需要从数组中的任何位置插入和删除字节。
起初,我认为常规数组是最好的。
byte[] buffer = new byte[ArraySize];
这将允许我访问数组中的任何字节。我也可以调整数组的大小。但是,似乎没有任何内置支持在数组中移动或移动项目。
一种选择是有一个循环来逐个移动项目,但这在 C# 中听起来非常低效。另一种选择是创建一个新数组并将字节复制到正确的位置,但这需要复制数组中的所有数据。
没有更好的选择吗?
实际上,我刚刚找到了Buffer Class,它看起来非常适合我的需要。
看起来该BlockCopy
方法将阻止复制一堆项目并支持在同一数组内复制,甚至可以正确处理重叠项目。
我认为在这种情况下最好的选择是常规数组和列表之间的混合。不过,只有兆字节大小的数组才需要这样做。
所以你可以做这样的事情:
List<byte[]> buffer;
并且让列表中的每个元素都只是数据的一部分(比如 64K 或一些小且易于管理的东西)
它需要相当多的自定义代码,但在必须在大型数组中移动数据时绝对是最快的选择。
此外,如果你做的字节转换比其他任何事情都多,LinkedList<T>
可能会更好(但除了一组特定的情况外,它对所有事情都不利)
为了阐明为什么这比数组更正确,请考虑在数组的开头插入 1 个字节。您必须分配另一个数组(双倍内存消耗),然后在插入新字节后将每个字节复制到新数组,然后释放旧数组(可能堆损坏取决于大小)
现在考虑这个带有列表的方法。
如果您必须插入大量字节,您可能希望在buffer
列表的开头插入。这是一个 O(n) 操作,所以这个操作的结束效率是 O(n/CHUNK_SIZE)
或者,如果您只需要插入一个字节,您可以获取列表的第一个元素并照常复制数组。然后,速度是 O(CHUNK_SIZE),这并不可怕,特别是如果n
相比之下非常大(兆字节数据)