0

让我解释一下我需要完成什么。我需要将文件加载到 RAM 中并分析其结构。我正在做的是这样的:

//Stream streamFile;

byte[] bytesFileBuff = new byte[streamFile.Length];
if(streamFile.Read(bytesFileBuff, 0, streamFile.Length) == streamFile.Length)
{
    //Loaded OK, can now analyze 'bytesFileBuff'
    //Go through bytes in 'bytesFileBuff' array from 0 to `streamFile.Length`
}

但在我之前使用 Windows 和 32 位进程的经验中,似乎更少量的 RAM 也很难分配。(在那个特定的例子中,我未能在安装了 16GB RAM 的 Windows 7 机器上分配 512MB。)

所以我很好奇,是否有一个特殊的类可以让我处理假设为任意长度的文件的内容(通过实现页面文件架构的内部模拟)?

4

1 回答 1

2

如果线性流访问(即使是多次通过)不是一个可行的选项,Win32 中的解决方案是使用具有相对较小视图的内存映射文件。

我不认为你可以在 C# 中轻松做到这一点,但我错了。事实证明,.NET 4.0 及更高版本提供了包装内存映射文件 API 的类。

请参阅http://msdn.microsoft.com/en-us/library/dd997372.aspx

如果您在 C/C++ 中使用过内存映射文件,您将知道该怎么做。

基本思想是使用MemoryMappedFileCreateFromFile来获取MemoryMappedFile对象。使用该对象,您可以调用CreateViewAccessor方法来获取表示文件块的不同MemoryMappedViewAccessor对象;您可以使用这些对象从您选择的块中读取文件。确保您MemoryamappedViewAccessors努力释放内存缓冲区。

您必须制定正确的策略来使用内存映射文件。您不想创建太多的小视图,否则您将遭受大量开销。大视图太少,您将消耗大量内存。

(正如我所说,我不知道 .NET 中的这些类包装器。请仔细阅读 MSDN 文档:在我花在审查它们的几分钟内,我可能很容易错过了一些重要的东西)

于 2013-03-25T03:13:09.267 回答