【发布时间】:2021-01-24 09:49:02
【问题描述】:
我有一个大型多维数组,需要用 protobuf 存储。该数组最多可以包含 5120*5120 = 26,214,400 个项目。不幸的是,Protobuf 不支持存储多维数组。
作为测试,我写了两个函数和一个额外的类。类存储和 x,y 指向数组内部的位置 (array[x, y])。该类有一个“值”,即来自数组 [x,y] 的数据。我使用 List 来存储这些数据。
当我生成一个相当小的数组 (1024*1024) 时,我得到一个超过 169MB 的输出文件。根据我的测试,它加载并生成文件非常快,所以那里没有问题。但是,文件大小很大 - 我肯定需要减小大小。
这是一个正常的文件大小,还是我要重新考虑我的整个过程?我应该在保存之前压缩数据吗(压缩文件需要从 169MB 到 6MB)?如果是这样,用 C# 压缩文件最快/最简单的方法是什么?
这是基于我的真实代码的伪代码。
[ProtoContract]
public class Example
{
[ProtoIgnore]
public string[,] MyArray { get; set; }
[ProtoMember(0)]
private List<MultiArray> Storage { get; set; }
public void MoveToList()
{
for (int x = 0; x < MyArray.GetLength(0); x++)
{
for (int y = 0; y < MyArray.GetLength(1); y++)
{
Storage.Add(new MultiArray
{
_x = x,
_y = y,
value = MyArray[x, y]
});
}
}
}
public void MoveToArray()
{
MyArray = new string[1024, 1024];
for (int i = 0; i < Storage.Count; i++)
{
MyArray[Storage[i].X, Storage[i].Y] = Storage[i]._value;
}
}
}
[ProtoContract]
public class MultiArray
{
[ProtoMember(0)]
public int _y { get; set; }
[ProtoMember(1)]
public int _x { get; set; }
[ProtoMember(2)]
public string _value { get; set; }
}
注意:该值必须是数组的正确 x/y。
感谢任何建议。
【问题讨论】:
标签: c# arrays list protobuf-net