3

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

起初,我认为常规数组是最好的。

byte[] buffer = new byte[ArraySize];

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

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

没有更好的选择吗?

4

2 回答 2

2

实际上,我刚刚找到了Buffer Class,它看起来非常适合我的需要。

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

于 2012-11-12T21:31:39.967 回答
1

我认为在这种情况下最好的选择是常规数组和列表之间的混合。不过,只有兆字节大小的数组才需要这样做。

所以你可以做这样的事情:

List<byte[]> buffer;

并且让列表中的每个元素都只是数据的一部分(比如 64K 或一些小且易于管理的东西)

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

此外,如果你做的字节转换比其他任何事情都多,LinkedList<T>可能会更好(但除了一组特定的情况外,它对所有事情都不利)

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

现在考虑这个带有列表的方法。

如果您必须插入大量字节,您可能希望在buffer列表的开头插入。这是一个 O(n) 操作,所以这个操作的结束效率是 O(n/CHUNK_SIZE)

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

于 2012-11-12T21:35:10.763 回答