从文件缓冲数据。代码不按预期工作

时间:2016-04-20 07:17:09

标签: c# arrays buffer memory-size

我在C#方面不是很有经验,但有很多其他语言的经验。

我在C#做一个项目,我必须阅读和修改大文件。 为此,我编写了一个缓冲方案,我将数据块保存在内存中,并在需要阅读更多内容时将它们交换到磁盘。我总是通过将以下元素移回一个位置来消除数组中的[0]元素。

public struct TBBuffer
{
    public long offset;
    public short[] data;
    public GCHandle dataHandle;
}
//tb is a TBBuffer[], the data[] is initialized to 4096.

如果我使用一个小样本文件,其中所有内容都适合分配的缓冲区,那么一切都按预期工作。

每当我需要释放一些内存以获取更多数据时,我会这样做:

int bufIdx,bufNo;
for (bufIdx = 0; bufIdx < tb.buffer.Length - 1; bufIdx++)
{
    tb.buffer[bufIdx] = tb.buffer[bufIdx + 1];
}
bufNo = tb.Length - 1;

我已经确定上面的代码是问题的根源,但我无法找出原因。

所以我的问题是:考虑TBBuffer结构及其内容,是否有人知道为什么这不能按预期工作?

是否有更有效的方法来执行此操作。

3 个答案:

答案 0 :(得分:0)

你在寻找数组调整大小吗?

  Array.Resize(ref tb.buffer, newSize);

只要出示你对.Net的意图,就让它(以有效的方式)为你做好工作。

答案 1 :(得分:0)

在for循环中

,您使用tb.Length。我认为它应该是tb.buffer.Length

int bufIdx,bufNo;
for (bufIdx = 0; bufIdx < tb.buffer.Length - 1; bufIdx++)
{
    tb.buffer[bufIdx] = tb.buffer[bufIdx + 1];
}
bufNo = tb.Length - 1;

答案 2 :(得分:0)

我解决了我的问题...相当尴尬,但问题是最后一个缓冲区的数据[]在我执行for()移动特技之后指向与倒数第二个相同。添加tb.buffer [bufNo] .data = new short [4096];声明一切都恢复正常。感谢您的时间和所有建设性的反馈。我将研究内存映射文件,看看这个功能是否是更好的选择。