绘制多个基于时间的开/关

问题描述 投票:1回答:1

我有一大堆数据库连接正在使用一段时间,然后在再次被调用之前休息。

我希望随着时间的推移绘制它们的用法,所以我为每个连接成像一行,随着时间的推移打开和关闭。

基本上可以格式化数据但是需要,但作为一个例子,它可能看起来像这样

2018-03-01 20:31:00,000Z foo start
2018-03-01 20:31:00,100Z bar start
2018-03-01 20:31:00,300Z bar stop
2018-03-01 20:31:00,400Z foo stop
2018-03-01 20:31:00,600Z bar start
2018-03-01 20:31:00,900Z bar stop

情节看起来像这样

foo ****
bar  **   ***
    0123456789

底部的数字表示100毫秒

gnuplot
1个回答
1
投票

我认为这超出了Gnuplot所能提供的“纯粹”。但是,有人可能会对数据文件进行预处理,以使其更容易被Gnuplot消化。例如,下面的示例脚本通过数据,以100毫秒为单位表示日期/时间,并且对于相应时间foo的每个事件(bar / t)标记在时间t处有多少个所述事件的实例。加载整个文件后,它会处理此数据并为每个事件打印事件至少运行一个实例的所有时间间隔。这具有以下优点:它还支持相同类型的重叠事件(即,同时连接)。

#!/usr/bin/env python
import datetime
import sys

t_min = sys.maxsize
t_max = -t_min
events = {}
with open(sys.argv[1], 'r') as F:
    for line in F:
        date, time, event, etype = map(lambda s: s.strip(), line.strip().split())
        if not etype in ['start', 'stop']: continue

        t = datetime.datetime.strptime('{date:s} {time:s}'.format(date = date, time = time), '%Y-%m-%d %H:%M:%S,%fZ').timestamp()
        t = int(t*10)
        t_min = min(t_min, t)
        t_max = max(t_max, t)

        if not event in events: events[event] = {}
        if not t in events[event]: events[event][t] = 0
        events[event][t] += (1 if etype == 'start' else -1)

unique_events = sorted(events.keys())
for eid, event in enumerate(unique_events):
    print('#%d\t%s' % (eid, event))

    ts = sorted(events[event].keys())

    multiplicity, t_prev = 0, 0
    for t_curr in ts:
        f = events[event][t_curr]
        t_curr -= t_min

        if multiplicity > 0:
            print('{t_prev:d}\t{eid:d}\t{multiplicity:d}\n{t_curr:d}\t{eid:d}\t{multiplicity:d}\n'.format(t_prev = t_prev, t_curr = t_curr, eid = eid, multiplicity = multiplicity))

        multiplicity = max(multiplicity + f, 0)
        t_prev = t_curr

对于以下样本数据:

2018-03-01 20:31:00,000Z foo start
2018-03-01 20:31:00,000Z foo start
2018-03-01 20:31:00,100Z bar start
2018-03-01 20:31:00,300Z bar stop
2018-03-01 20:31:00,400Z foo stop
2018-03-01 20:31:00,600Z bar start
2018-03-01 20:31:00,900Z bar stop
2018-03-01 20:31:00,900Z foo stop

这会产生:

#0  bar
1   0   1
3   0   1

6   0   1
9   0   1

#1  foo
0   1   2
4   1   2

4   1   1
9   1   1

这意味着例如事件1foo)有2个实例在[0, 4]区间运行,而[4, 9]只有1个实例。然后,此输出可由Gnuplot直接处理。

© www.soinside.com 2019 - 2024. All rights reserved.