MemoryMappedViewAccessor.ReadArray <t>方法如何在内部工作</t>

时间:2011-07-06 05:42:59

标签: c# arrays memory-mapped-files

我一直在BinaryReader或Stream中有一个快速读取数组的方法。由于MS引入了MemoryMappedFiles,因此有一个类MemoryMappedViewAccessor,它有一个名为ReadArray的方法来读取数组。

有人知道这种方法是如何工作的。目前,从二进制流中读取数组非常糟糕。首先必须将流读取为字节,然后将字节流复制到目标数组格式。能够一步到位就好了。

我尝试在VS2010中启用.NET-Framework源代码,但它不起作用。

目前我读取了几种原始数组数据类型的数据,如下所示:

public static float[] ReadSingles(this Stream stream_in, int count)
    {
        FileStream fileStream = stream_in as FileStream;

        float[] Data = new float[count];

        if (count == 0) return Data;

            fixed (float* dataptr = &Data[0])
            {
                if ((fileStream == null) || (StreamExt.Mode == StreamExtMode.Conventional))
                {
                    byte[] bts = ReadBytes(stream_in, count * sizeof(float));// stream_in.ReadBytes(count * sizeof(float));
                    Marshal.Copy(bts, 0, new IntPtr(dataptr), bts.Length);
            }
        }

        return Data;
    }

对此有一个很好的答案。

由于 马丁

1 个答案:

答案 0 :(得分:2)

归结为extern方法,简而言之:我们无法直接看到。它不是在托管代码中完成的,而是由CLI主机完成的:

[MethodImpl(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
private static extern unsafe void PtrToStructureNative(
         byte* ptr, TypedReference structure, uint sizeofT);

重新使用现有代码; IMO,这里的问题是您选择分配count * sizeof(float)如果您打算避免额外的byte[]开销,我会创建一个较小的缓冲区(比如Max(count, 1000) * sizeof(float) })并使用循环,逐步填充Data

此外,如果您不需要同时使用所有浮点数,请考虑使用迭代器块,这将斜杠此处的内存开销(但这意味着您只能访问这些项目作为序列,而非随机访问)。