文件中的数据缓冲.代码未按预期工作

本文关键字:工作 代码 数据 缓冲 文件 | 更新日期: 2024-10-20 20:37:45

我对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结构及其内容,有人知道为什么它不能按预期工作吗?

有没有更有效的方法可以做到这一点。

文件中的数据缓冲.代码未按预期工作

您想调整数组大小吗?

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

只要向.Net表明你的意图,让它(以有效的方式)为你做这项工作。

在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;

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