我一直在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;
}
对此有一个很好的答案。
由于 马丁
答案 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
。
此外,如果您不需要同时使用所有浮点数,请考虑使用迭代器块,这将斜杠此处的内存开销(但这意味着您只能访问这些项目作为序列,而非随机访问)。