Ruby 区分两个哈希值,并在循环中与累积总和合并



需要Ruby的帮助!

我循环收集有关PHP进程的数据(PID,utimes(。我有两个哈希值。第一个"h1"看起来像:

"domain1" => { :utime => 0, :last_seen => 0, :process_count => 0, :process_count_avg => 0 },
"domain2" => { :utime => 0, :last_seen => 0, :process_count => 0, :process_count_avg => 0 }

这是它的代码:

h1[vhostname] ||= { :utime => 0, :last_seen => 0, :process_count => 0, :process_count_avg => 0 }
h1[vhostname][:utime] += utime_proc 
h1[vhostname][:last_seen] = 0

"vhostname"是包含域名的字符串。 "utime_proc"是一个 utime 值。

在每个循环中,我都对特定域的所有进程的所有 utimes 求和,输出是 Domain 及其总和的 utime。但这扭曲了真实状态。

我需要做的是为特定域制作 utimes 的累积总和。作为所有当前进程的 utime 总和,但为所有已结束的进程添加 utime 的总和。我可能必须为每个子域 utime 存储 pid 进程,如果这个过程消失,它的最后一个 utime 将添加到默认值("h1"哈希(:该域的 utime。

因此,我创建了另外两个哈希:"h2"和"h3"。"h3"的值在每个循环回合中重置,这将存储(子(域的所有PID及其utime,如下所示:

h3[vhostname] = []
h3[vhostname] << {:pid => pid, :utime => utime_proc}
">

h2"哈希存储之前所有循环轮次的PID,与"h3"相同,但不会重置:

if not h2.key?(vhostname)
h2[vhostname] = []
h2[vhostname] << {:pid => pid, :utime => utime_proc}
end

输出哈希应如下所示:

{"domain1"=>[{:pid=>2, :utime=>20}, {:pid=>1, :utime=>10}], "domain2"=>[{:pid=>1, :utime=>10}, {:pid=>3, :utime=>30}]}

现在我需要帮助: 1. 可能区分这两个哈希值,如果 PID 用于 disseapear,我需要将它们从"h2"哈希中删除,其最后一个 utime 值总和与存储在"h1"中的 utime 值。 2.域出现了新的PID(在"h3"中是新的PID,在"h2"中尚未(,将此PID添加到" h2"中,并将其utime添加到特定域。

这些是我无法做到的。我知道我可以简单地做:

"h2-h3">

或"h3-h2",但我不知道如何处理结果以及如何处理它。

伙计们,你能帮帮我吗?我的代码的简短版本是波纹管。我仍然是红宝石新手。

h1 = {}
# Hash to collect PID and its utimes
h2 = {}
loop do  
# Hash to temporarly store PID and its utimes - in each cycle is reseting
h3 = {}
# Here I collect processes
#############
#############
# Collect PIDs and its utimes
# Store PIDs and its utimes temporarly - only for this loop round
h3[vhostname] = []
h3[vhostname] << {:pid => pid, :utime => utime_proc}
# is h2 empty? if so, this is probably first loop round
if not h2.key?(vhostname)
h2[vhostname] = []
h2[vhostname] << {:pid => pid, :utime => utime_proc}
else
# h2 is not empty, we can diff and sum
# PROBABLY PLACE I NEED TO HELP WITH
end
# Here I do some more magic with h1 and output the result with some delay
end

更新

我将 h2 和 h3 哈希结构更改为:

{:domain => "domain1.com", :pid => XXXX, :utime => YYYYY}

我不会尝试实现您的逻辑,但处理哈希是我将尝试阐明的。为了简单起见,我没有循环,只是处理测试数据

domains = ['domain1','domain2','domain3']
h1 = {}
h2 = {}
# generate blank template for each domain
domains.each { |vhostname|
h1[vhostname] ||= { :utime => 0, :last_seen => 0, :process_count => 0, :process_count_avg => 0 }
h2[vhostname] ||= {}
}
# dummy loop
1.upto(5) {
h3={}
# start collecting data for each domain
domains.each { |vhostname|
# TEST DATA
h3[vhostname] ||= {}
1.upto(5) {
_pid = rand(1..10)
h3[vhostname][:"#{_pid}"] ||= {:utime => rand(9999)}
}
# TEST DATA
h2[vhostname].merge!(h3[vhostname])
h2[vhostname].each { |proc, details|
unless h3[vhostname].key?(proc)
h1[vhostname][:utime] = h1[vhostname][:utime] + details[:utime]
end
}
h2[vhostname] = h2[vhostname].keep_if { |proc| h3[vhostname].key?(proc)}
}
}

最新更新