我在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
结构及其内容,是否有人知道为什么这不能按预期工作?
是否有更有效的方法来执行此操作。
答案 0 :(得分:0)
你在寻找数组调整大小吗?
Array.Resize(ref tb.buffer, newSize);
只要出示你对.Net的意图,就让它(以有效的方式)为你做好工作。
答案 1 :(得分:0)
,您使用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];声明一切都恢复正常。感谢您的时间和所有建设性的反馈。我将研究内存映射文件,看看这个功能是否是更好的选择。