写入FileStream时c#中的OutOfMemoryException

时间:2011-11-22 08:54:18

标签: c# buffer filestream out-of-memory

c#中的OutOfMemoryExcetpion ...我正在尝试创建一个主要基于BPlus树的新索引。该索引应该用于大量数据(超过5 000 000项)。为了使索引快速,我在RAM中保持内部树节点(每个节点有大约4KB的信息,256个子节点引用)(它们经常被访问)。叶子(可变大小)被写入磁盘,最大为200MB的文件 为了从文件中写入或读取数据,我使用以下内容:

FileStream _FS = new FileStream(FullPath, FileMode.OpenOrCreate);
...
byte[] Data = new byte[size];
_FS.Read(Data, 0, size);
...
_FS.Write(Data, 0, _BlockSize);

问题是,在插入的项目数量较多(19 000 000)时,我得到了OutOfMemoryException。我知道树的内部结构(内部节点)可能占用大量内存,但是,我认为这不是内存满的原因。

当我使用以下构造函数时:

_FS = new FileStream(FullPath, FileMode.OpenOrCreate, FileAccess.ReadWrite,
FileShare.None, 1024, FileOptions.WriteThrough | Settings.FILE_FLAG_NO_BUFFERING);

不会引发OutOfMemoryException(至少不会产生20 000 000个项目),但是,插入项目的速度会更小。 我相信当使用第一个FileStream构造函数.net使用一些内部缓冲区(在RAM中)时,它会填充内存并导致引发OutOfMemoryException。

问题是,如何使用FileStream(或其他东西)以便能够高速插入项目(写入磁盘),而不提高OutOfMemoryException?

1 个答案:

答案 0 :(得分:2)

如果你在第一个例子的循环中放一个_FS.Flush(),比如每10000个记录会怎样?

相关问题