2012-02-03 56 views
0

我有以下數據,其中每行告訴我一個過程的開始和結束時間。紅寶石找到範圍內發生的次數

我想知道從12:20:00到14:00:00以5分鐘的步驟,我想知道在每個時間點運行多少個進程。例如,在12:30和12:35分別有2個和1個進程運行。

我想在Ruby 1.8中實現這個功能,以及Ruby的這種有效方法是什麼?

12:28:08, 12:33:29 
12:28:20, 12:33:41 
12:32:32, 12:32:44 
12:36:56, 12:42:31 
13:08:55, 13:09:08 
14:09:00, 14:09:12 
14:59:19, 15:04:37 
15:41:40, 15:41:52 

(評論) PS:我已經得到了開始時間的數組,STIME和結束時間,ETIME。我想要做這樣的事情:

(sTime..eTime).step($time_interval) do |cTime| # Current Time 
     cnt = 0 
     (0..(sessionstarttime.length-1)).each {|i| if cTime.between? (sessionstarttime[i], sessionendtime[i]); cnt += 1} 
     printf "%s, %d\n", cTime.strftime("%d/%m/%Y %H:%M:%S"), cnt 
    end 
+0

查找在特定時間運行多少個進程的方法是什麼? – Phrogz 2012-02-03 14:21:28

回答

0

您可以嘗試(在1.9開發的,但應該在1.8以及工作)驗證碼:

a = %Q{ 
12:28:08, 12:33:29 
12:28:20, 12:33:41 
12:32:32, 12:32:44 
12:36:56, 12:42:31 
13:08:55, 13:09:08 
14:09:00, 14:09:12 
14:59:19, 15:04:37 
15:41:40, 15:41:52 
} 

start = '12:20:00' 
stop = '14:00:00' 

require 'stringio' 

def time_to_sec(time) 
    a = time.split(':').map(&:to_i) 
    a[0] * 3600 + a[1] * 60 + a[2] 
end 

def sec_to_time(sec) 
    h, n = sec.divmod 3600 
    m, s = n.divmod 60 
    "%02d:%02d:%02d" % [h, m, s] 
end 

rows = StringIO.new(a).read.delete(",").split("\n").reject{ |i| i.empty? }.map do |range| 
    range.split.map{ |time| time_to_sec(time) } 
end 

ranges = rows.map{ |i| i[0]..i[1] } 

(time_to_sec(start)..time_to_sec(stop)).step(5*60) do |time| 
    cnt = ranges.count{|i| i.include? time} 
    puts "#{sec_to_time(time)}: #{cnt}" 
end 

當然,你並不需要中「A」變量或StringIO如果使用真實文件。

0

如果值轉換爲一個Time對象(注意,我認爲在這個例子中的一個2000-01-01日期),你可以做到以下幾點:

a= [ 
    { :s=> Time.utc(2000, 1, 1, 12, 28, 8), :e=> Time.utc(2000, 1, 1, 12, 33, 29) }, 
    { :s=> Time.utc(2000, 1, 1, 12, 28, 20), :e=> Time.utc(2000, 1, 1, 12, 33, 41) }, 
    { :s=> Time.utc(2000, 1, 1, 12, 32, 32), :e=> Time.utc(2000, 1, 1, 12, 32, 44) }, 
    { :s=> Time.utc(2000, 1, 1, 12, 36, 56), :e=> Time.utc(2000, 1, 1, 12, 42, 31) }, 
    { :s=> Time.utc(2000, 1, 1, 13, 8, 55), :e=> Time.utc(2000, 1, 1, 13, 9, 8) }, 
    { :s=> Time.utc(2000, 1, 1, 14, 9, 0), :e=> Time.utc(2000, 1, 1, 14, 9, 12) }, 
    { :s=> Time.utc(2000, 1, 1, 14, 59, 19), :e=> Time.utc(2000, 1, 1, 15, 4, 37) }, 
    { :s=> Time.utc(2000, 1, 1, 15, 41, 40), :e=> Time.utc(2000, 1, 1, 15, 41, 52) } 
] 

checkTime = Time.utc(2000, 1, 1, 12, 32, 40) 

a.delete_if{|b| #b[:s] is start time, b[:e] is end time 
    (b[:s] > checkTime) || (b[:e] < checkTime) 
} 
0

這裏有一對夫婦模擬應該計算所需內容的簡單對象。這給你一個接口的開始,你可以使用它來做更復雜的邏輯,如果你需要的話。

require 'time' 

# Object Definitions 

class ProcessTimelineEntry 
    def initialize(start_time, end_time) 
    @start_time = start_time 
    @end_time = end_time 
    end 

    def running_at?(time) 
    time >= @start_time && time < @end_time 
    end 
end 

class ProcessTimeline 
    def initialize() 
    @entries = [] 
    end 

    def add_entry(start_time, end_time) 
    @entries << ProcessTimelineEntry.new(start_time, end_time) 
    end 

    def process_count_at(time) 
    @entries.count { |e| e.running_at?(time) } 
    end 
end 

# Example Usage 

timeline = ProcessTimeline.new 

DATA.readlines.each do |line| 
    start_time, end_time = line.split(', ') 
    timeline.add_entry(Time.parse(start_time), Time.parse(end_time)) 
end 

puts timeline.process_count_at(Time.parse("12:30")) 
puts timeline.process_count_at(Time.parse("12:35")) 


__END__ 
12:28:08, 12:33:29 
12:28:20, 12:33:41 
12:32:32, 12:32:44 
12:36:56, 12:42:31 
13:08:55, 13:09:08 
14:09:00, 14:09:12 
14:59:19, 15:04:37 
15:41:40, 15:41:52 
0

這裏是一個解決方案,它會變得更好,以大量啓動 - 停止對或時間步長的比其他發佈答案(因爲你想知道的期間每個時間步運行的進程數,不只是1或2的選定的時間步驟):

START = Time.utc(2000,1,1, 12,20,0).to_i 
FINISH = Time.utc(2000,1,1, 14,0,0).to_i 
STEP = 60*5 # 5 minutes 
result = Array.new(((FINISH-START).to_f/STEP).ceil, 0) 
processes = %Q{ 
    12:28:08, 12:33:29 
    12:28:20, 12:33:41 
    12:32:32, 12:32:44 
    12:36:56, 12:42:31 
    13:08:55, 13:09:08 
    14:09:00, 14:09:12 
    14:59:19, 15:04:37 
    15:41:40, 15:41:52 } 

processes.each_line do |times| 
    times =~ /(\d\d):(\d\d):(\d\d), (\d\d):(\d\d):(\d\d)/ 
    st = Time.utc(2000,1,1, $1.to_i,$2.to_i,$3.to_i).to_i 
    fin = Time.utc(2000,1,1, $4.to_i,$5.to_i,$6.to_i).to_i 
    st = START if st < START 
    fin = END if fin > END 
    (st..fin).step(STEP) do |t| 
    result[(t-START)/STEP] += 1 
    end 
end 

多少進程每個時間步長期間運行的計數將在result留下。如果需要提供一個很好的界面,你可以在它周圍放置一個對象包裝器。