如何减少Winform应用程序的内存消耗

时间:2018-08-06 08:14:31

标签: c# winforms performance

背景

我有一个需要增强性能的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是新元素

1 个答案:

答案 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

因此,您需要处理的信息较少。是的,您必须跟踪其他内容,但是没有什么是完美的。