我在这里看到了这里,也通过谷歌搜索了几种方法来将字节数组转换为结构体。
但是我所寻找的是是否有一种方法可以一次性从文件(好吧,无论是什么内存输入)读取结构数组?
我的意思是,从文件加载一个结构体数组通常需要更多的CPU时间(使用BinaryReader每个字段进行一次读取),而不是IO时间。有什么解决方法吗?
我正在尝试尽可能快地从文件中加载约400K个结构体。
Thanks
帕布罗
我在这里看到了这里,也通过谷歌搜索了几种方法来将字节数组转换为结构体。
但是我所寻找的是是否有一种方法可以一次性从文件(好吧,无论是什么内存输入)读取结构数组?
我的意思是,从文件加载一个结构体数组通常需要更多的CPU时间(使用BinaryReader每个字段进行一次读取),而不是IO时间。有什么解决方法吗?
我正在尝试尽可能快地从文件中加载约400K个结构体。
Thanks
帕布罗
以下网址可能会引起您的兴趣。
将此翻译为中文:http://www.codeproject.com/KB/files/fastbinaryfileinput.aspx http://www.codeproject.com/KB/files/fastbinaryfileinput.aspx
否则,我认为可以像下面这样编写伪代码:
一次性读取二进制数据并转换回结构体。
public struct YourStruct
{
public int First;
public long Second;
public double Third;
}
static unsafe byte[] YourStructToBytes( YourStruct s[], int arrayLen )
{
byte[] arr = new byte[ sizeof(YourStruct) * arrayLen ];
fixed( byte* parr = arr )
{
* ( (YourStruct * )parr) = s;
}
return arr;
}
static unsafe YourStruct[] BytesToYourStruct( byte[] arr, int arrayLen )
{
if( arr.Length < (sizeof(YourStruct)*arrayLen) )
throw new ArgumentException();
YourStruct s[];
fixed( byte* parr = arr )
{
s = * ((YourStruct * )parr);
}
return s;
}
现在,您可以一次性从文件中读取字节数组,并使用BytesToYourStruct将其转换回结构。
希望您能执行这一想法并进行检查...
I found a potential solution at this site - http://www.eggheadcafe.com/software/aspnet/32846931/writingreading-an-array.aspx
它基本上说要使用二进制格式化程序,如下所示:
FileStream fs = new FileStream("DataFile.dat", FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, somestruct);
I also found two questions from this site - Reading a C/C++ data structure in C# from a byte array and How to marshal an array of structs - (.Net/C# => C++)
我以前从没做过这个,我自己也是一个C# .NET的初学者。我希望这个解决方案能有所帮助。