【问题标题】:Drawing a graph with large values but small change in the values绘制具有较大值但值变化较小的图形
【发布时间】:2013-02-20 14:40:53
【问题描述】:

我正在尝试绘制一个图表来描述进程的内存消耗与时间的关系。在获得 SO 的帮助后,我能够使用 Qt 消耗内存并绘制图形。为了展示内存的微小变化,我以字节为单位缩放 Y 轴。

我的问题是,通常消耗的内存是一个非常大的值,要在我的图表中展示,它会超出可见区域。

我研究here 如何使用对数刻度来避免这个问题。但这会导致另一个问题:

一段时间后,通常进程会随着内存初始化而稳定下来,与此进程消耗的总内存相比,内存消耗的任何进一步变化都是非常小的值。因此,这些变化在我的图表上并不真正可见,因为我正在使用日志进行缩放。但我的主要目的是以图形格式展示总内存消耗的变化。

我的方法是错误的还是有更好的方法来实现这一点?

在 Qt/C++/qml 中实现,但欢迎通用想法。

例如。

时间:0 秒 | 消耗:0 字节

时间:1 秒 | 消耗:1212120字节

时间:2 秒 | 消耗:1212520 字节

时间:3 秒 | 消耗:1212720 字节

.. 消费在这个时候稳定下来 -- 现在只有很小的变化 --

时间:20 秒 | 消耗:1212890字节

时间:21 秒 | 消耗:1212893 字节

时间:22 秒 | 消耗:1212895 字节

【问题讨论】:

  • 如何绘制内存使用的delta?也就是说,第 2 秒 +500 字节,第 3 秒 +200 字节,...
  • 两全其美 - 在一个带有对数缩放的图上显示幅度,在另一个图上显示实际字节数。对于第二个图,将 ymin、ymax 缩放为过去 10 秒内运行平均值的 20%。
  • @Dukeling 谢谢!您能否将其发布为答案,以便我可以就您的解决方案提出一些其他问题,并可能接受它作为答案。
  • @timrau 但是对于第一个增量间隔,当消耗从 0 增加到非常高的值时会出现一个尖峰,然后这种变化会突然下降到很小的值。这个初始峰值很可能会超出我的图表?

标签: algorithm graphics graph plot


【解决方案1】:
  • 可以考虑分数幂(例如平方根)而不是对数。

  • 忽略第一个值。如果时间 0 的值始终为 0,则可以考虑忽略它。它显着抵消了您的数据集。那么图上的y-min可以是1212120,这样会更好看:

  • 显示变化(时间 x 的值 - 时间 x-1 的值)而不是实际值(时间 x 的值)也可能是个好主意。

【讨论】:

  • 我想知道这个想法是如何产生的。您决定使用分数幂是因为它们的变化率会小于对数函数的变化率吗?
  • 我在算法复杂性方面做了很多工作,这让大家对nsqrt(n)log(n) 之间的关系非常熟悉。从本质上讲,我看到你想要介于 nlog(n) 之间的东西,这正是 sqrt(n) 适合的地方。
【解决方案2】:

这是处理它的一种方法:

  1. 绘制变化,而不是绝对值。
  2. 使用插图或小图表,例如在地图中,显示图表角落的巨大变化。在图表的主要部分,显示小的变化。
  3. 在主图表的另一个角落显示当前光标位置(单个数字)的内存使用值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2014-10-30
    • 2019-06-28
    • 2011-10-31
    相关资源
    最近更新 更多