我有一个应用程序(C#,WPF),它显示许多金融图表,其中包含来自服务器的实时数据流。在内存中收集的数据可能会变得有点大,我不想在磁盘上保留任何数据。
由于历史数据本身没有变化,只是添加了,是否有意义将数据(存储在集合对象中)保存为某种压缩格式?
是否有可能,如果有的话,有人可以推荐一个好的做法吗?
更新
关于性能和权衡的一些注意事项: 我知道压缩会增加访问数据的延迟,但是,用户只需要对到达的新数据进行快速更新。访问已经渲染的数据(例如,研究或重新渲染)时,他不需要快速响应。
答案 0 :(得分:13)
压缩和解压缩会使您的应用程序变慢,因此对于性能(速度)而言,这不是一个好的选择。 压缩仅在您担心可用内存时才有用。将数据存储/交换到临时文件夹可能更容易。
表现的关键是衡量。只有在你碾压数字时才采取行动。
答案 1 :(得分:6)
压缩数据在内存使用方面具有优势,但在使数据无法使用方面存在缺点(您必须将其解压缩才能再次使用),以及占用额外的CPU。
如果没有更多信息,很难知道这会变得有利的权衡点 - 这取决于你。但是,如果你没有使用这个旧的陈旧数据,最好扔掉它(即:让它超出范围/停止存储它)而不是压缩它。
压缩可以通过System.IO.Compression中的类完成,并且非常简单。但是,这些类通常表现不佳,因此您可能还想考虑第三方替代方案,例如DotNetZip。
答案 2 :(得分:1)
这是性能和内存占用之间的权衡,也取决于您使用的数据结构。 “通用”压缩(即gzip,游程编码等)对于许多类型的数据没有意义。
可能适用于您的一种方法是选择更合适的数据结构来优化内存占用 - 例如,对于您的图表,您是否真的需要存储独立的股票价格,或者您只需存储即可生存delta值?如果后者为真,则可能会减少每个数据点所需的位数。另一件事是重新发生所有图表中需要的模式 - 您是否可以将这些图表分解为所有图表使用的单独对象,因此仅实例化一次?
答案 3 :(得分:0)
如果您正在寻找更好的性能,压缩是不可取的。只要您的客户端主机有足够的内存来处理数据,那么保持数据不压缩将导致最大的性能。无论何时访问数据,压缩数据都需要运行压缩和压缩算法。
如果客户端主机上的内存不足,那么您将面临被迫压缩存储数据的情况。但请注意,这只会在压缩数据时节省内存,并且垃圾收集已收集未压缩的内存对象。由于数据需要解压缩才能使用,因此永远不会提供最大化客户端RAM的解决方案。
考虑到所有这些,.NET提供了用于执行gzip压缩的System.IO.Compression命名空间。如果你需要压缩,我会从那里开始。
答案 4 :(得分:0)
如果您愿意自己编写代码,则需要节省空间的数据结构,不需要使用解码/解压缩。 Steve Hanov describes Succinct Data Structures在他最新的博文中。他的例子是一个简洁的特里,但没有什么能阻止你代表其他物体和结构。他引用了几种替代实现方式。
显然,这不是一个开箱即用的解决方案。你必须决定是否值得努力建立和测试简洁的表示。