Don*_*eba 13 .net binaryformatter
BinaryFormatter序列化的128³双倍阵列,占用50 MB的空间.序列化128个结构的数组有两个双字段需要150 MB,处理时间超过20秒.
是否有快速简单的替代品可以生成压缩文件?我的期望是上面的例子分别占用16和32 MB,并且在两秒钟内处理.我看了一下protobuf-net,但看起来它甚至不支持struct数组.
PS:我为记录文件大小时出错而道歉.BinaryFormatter的实际空间开销并不大.
如果您使用BinaryWriter而不是Serializer,您将获得所需的(mimimal)大小.
我不确定速度,但试一试.
在我的系统上写32MB需要不到0.5秒,包括打开和关闭流.
您必须编写自己的for循环来写入数据,如下所示:
struct Pair
{
public double X, Y;
}
static void WritePairs(string filename, Pair[] data)
{
using (var fs = System.IO.File.Create(filename))
using (var bw = new System.IO.BinaryWriter(fs))
{
for (int i = 0; i < data.Length; i++)
{
bw.Write(data[i].X);
bw.Write(data[i].Y);
}
}
}
static void ReadPairs(string fileName, Pair[] data)
{
using (var fs = System.IO.File.OpenRead(fileName))
using (var br = new System.IO.BinaryReader(fs))
{
for (int i = 0; i < data.Length; i++)
{
data[i].X = br.ReadDouble();
data[i].Y = br.ReadDouble();
}
}
}
Run Code Online (Sandbox Code Playgroud)
序列化意味着添加元数据,以便可以安全地反序列化数据,这就是造成开销的原因。如果您自己序列化数据而不使用任何元数据,则最终会得到 16 MB 的数据:
foreach (double d in array) {
byte[] bin = BitConverter.GetBytes(d);
stream.Write(bin, 0, bin.Length);
}
Run Code Online (Sandbox Code Playgroud)
这当然意味着您还必须自己反序列化数据:
using (BinaryReader reader = new BinaryReader(stream)) {
for (int i = 0; i < array.Length; i++) {
byte[] data = reader.ReadBytes(8);
array[i] = BitConverter.ToDouble(data, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9759 次 |
| 最近记录: |