我们有一个v.large Dictionary<long,uint>(几百万条目)作为高性能C#应用程序的一部分.当应用程序关闭时,我们使用BinaryFormatter和将字典序列化为磁盘MemoryStream.ToArray().序列化在大约30秒内返回并生成大小约为200MB的文件.然后,当我们尝试使用以下代码反序列化字典时:
BinaryFormatter bin = new BinaryFormatter();
Stream stream = File.Open("filePathName", FileMode.Open);
Dictionary<long, uint> allPreviousResults =
(Dictionary<long, uint>)bin.Deserialize(stream);
stream.Close();
Run Code Online (Sandbox Code Playgroud)
返回需要大约15分钟.我们已经尝试了替代方案,慢速部分肯定是bin.Derserialize(stream),即在1秒内从硬盘驱动器(高性能SSD)读取字节.
有人可以指出我们做错了什么,因为我们希望加载时间与保存时间相同.
此致,马克
Dar*_*rov 11
您可以结帐protobuf-net或者自己序列化它,这可能是您可以获得的最快速度.
class Program
{
public static void Main()
{
var dico = new Dictionary<long, uint>();
for (long i = 0; i < 7500000; i++)
{
dico.Add(i, (uint)i);
}
using (var stream = File.OpenWrite("data.dat"))
using (var writer = new BinaryWriter(stream))
{
foreach (var key in dico.Keys)
{
writer.Write(key);
writer.Write(dico[key]);
}
}
dico.Clear();
using (var stream = File.OpenRead("data.dat"))
using (var reader = new BinaryReader(stream))
{
while (stream.Position < stream.Length)
{
var key = reader.ReadInt64();
var value = reader.ReadUInt32();
dico.Add(key, value);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
生成的文件大小=> 90M字节(85.8MB).
只是为了通过protobuf-net显示类似的序列化(接受的答案):
using System.Collections.Generic;
using ProtoBuf;
using System.IO;
[ProtoContract]
class Test
{
[ProtoMember(1)]
public Dictionary<long, uint> Data {get;set;}
}
class Program
{
public static void Main()
{
Serializer.PrepareSerializer<Test>();
var dico = new Dictionary<long, uint>();
for (long i = 0; i < 7500000; i++)
{
dico.Add(i, (uint)i);
}
var data = new Test { Data = dico };
using (var stream = File.OpenWrite("data.dat"))
{
Serializer.Serialize(stream, data);
}
dico.Clear();
using (var stream = File.OpenRead("data.dat"))
{
Serializer.Merge<Test>(stream, data);
}
}
}
Run Code Online (Sandbox Code Playgroud)
大小:83meg - 但最重要的是,您不必手动完成所有操作,引入错误.也快(在"v2"中会更快).
| 归档时间: |
|
| 查看次数: |
1771 次 |
| 最近记录: |