我有一个需要增强性能的WinForm应用程序。我写了大量的文件(大约200-500kbs),这些文件是使用常规File.probuff序列化并写入的。这些文件的IO总大小超过3Gb(数量约为10,000)。现在,以5分钟和7分钟的周期频率,我一个接一个地读取了一半文件,然后合并数据,然后再次对其进行序列化。众所周知,此过程在上述频率下消耗大量Ram。
我找到了一个有关使用Memory Mapped File
的解决方案,并且没有使用test
代码
byte[] Buffer = GZipCompressor.ConvertToByteStream<OHLCData>(sampleObj);
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", s.Length + 25))
{
MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
accessor.Write(54, (ushort)Buffer.Length);
accessor.WriteArray(54 + 2, Buffer, 0, Buffer.Length);
Console.WriteLine(proc.PrivateMemorySize64 / 1024);
}
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", s.Length + 25))
{
MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
ushort Size = accessor.ReadUInt16(54);
byte[] buffer = new byte[Size];
accessor.ReadArray(54 + 2, buffer, 0, buffer.Length);
Console.WriteLine(proc.PrivateMemorySize64 / 1024);
}
//then I convert the buffer back to class..
现在通过使用上面的代码,我无法实现我所寻求的性能改进,我的Ram使用率约为。与先前相同(或至少与预期不同)。
我还有另一种想法,可以使用Zip-Archive创建文件组的zip并将它们分配给MMF
。
我的问题:
注意:按照我的代码结构,创建数据字典并存储该字典是不可行的。
编辑:- 请注意,在上面的示例中,我不仅仅是将数据附加到末尾,我还必须在先前的数据中进行更改,例如从开始删除不赞成使用的数据形式。
示例任务表示。
文件存储:-
1,1
2,1
3,1
4,1
要合并的数据:-
3,2
5,2
最终输出:
2,1
3,3
4,1
5,2
在上面的示例中,请注意已弃用的1,1已删除,而3,1已更新为3,3,而5,2是新元素
答案 0 :(得分:0)
嘿,通过阅读您的帖子,我有些困惑。
您正在获取要序列化并存储到磁盘的数据。这将产生以下问题,您必须再次加载数据,这是一个缓冲区,然后分配或使用第二个缓冲区进行反序列化。如果将数据保存为非序列化状态会怎样?
让我感到困惑的第二件事是,您是否合并了以前合并的文件?例如,您获得文件foo1和foo2并将其合并到文件foo12中,在某个时间点之后,您将获得第三个文件foo3并将其合并到文件foo12中?无论如何,您都会消耗大量内存。检查您的数据是否可以进行位打包或查看不需要的数据类型,例如将int还原为uint_8或使用其他内容。
如果使用protobuf仅序列化压缩数据,则不是一个好主意。有一些压缩算法可以做得更好并且非常快。您是否绑定到protobuf?
另一个问题是为什么您的数据不是最少的。例如:
1,4
2,4
3,4
4,4
可能是:
T 4
1
2
3
4
因此,您需要处理的信息较少。是的,您必须跟踪其他内容,但是没有什么是完美的。