【发布时间】:2017-07-01 02:15:30
【问题描述】:
我遇到了滑动窗口问题的变体!
通常我们设置要滑动的元素数量,但在我的情况下,我想滑动时间!
我想达到的目标是一个函数(在这种情况下是线程) 能够在几秒钟内创建一个“时间”窗口(由用户给出)。
在这种情况下从队列的第一个元素开始:
[datetime.time(7, 6, 14, 537370), 584 add 5 seconds -> 7:6:19.537370 (end point) 并将此区间内的所有元素相加:
[datetime.time(7, 6, 14, 537370), 584]
[datetime.time(7, 6, 18, 542798), 761]
总数:584+761=1345
然后用第二个元素创建另一个“窗口”并继续。 重要提示:一个项目可以是多个窗口的一部分。同时生成项目,具有睡眠 n 秒然后刷新队列的功能的 naif 解决方案不适合我的问题。
我认为它是这篇文章的变体: Flexible sliding window (in Python)
但还是不能解决问题!任何帮助或建议将不胜感激。 谢谢!
元素列表示例:
[datetime.time(7, 6, 14, 537370), 584]
[datetime.time(7, 6, 18, 542798), 761]
[datetime.time(7, 6, 20, 546007), 848]
[datetime.time(7, 6, 24, 550969), 20]
[datetime.time(7, 6, 27, 554370), 478]
[datetime.time(7, 6, 27, 554628), 12]
[datetime.time(7, 6, 31, 558919), 29]
[datetime.time(7, 6, 31, 559562), 227]
[datetime.time(7, 6, 32, 560863), 379]
[datetime.time(7, 6, 35, 564863), 132]
[datetime.time(7, 6, 37, 567276), 651]
[datetime.time(7, 6, 38, 568652), 68]
[datetime.time(7, 6, 40, 569861), 100]
[datetime.time(7, 6, 41, 571459), 722]
[datetime.time(7, 6, 44, 574802), 560]
...
代码:
import random
import time
import threading
import datetime
from multiprocessing import Queue
q = Queue()
#this is a producer that put elements in queue
def t1():
element = [0,0]
while True:
time.sleep(random.randint(0, 5))
element[0] = datetime.datetime.now().time()
element[1] = random.randint(0, 1000)
q.put(element)
#this is a consumer that sum elements inside a window of n seconds
#Ineed something a sliding window time of ten seconds that sum all elements for n seconds
def t2():
windowsize = 5 #size of the window 5 seconds
while not queue.empty():
e = q.get()
start = e[0] #the first element is the beginning point
end = start + datetime.timedelta(seconds=windowsize) #ending point
sum += e[1]
#some code that solve the problem :)
a = threading.Thread(target=t1)
a.start()
b = threading.Thread(target=t2)
b.start()
while True:
time.sleep(1)
【问题讨论】:
-
一个元素可以成为你的几个“窗口”的一部分,还是你想在队列中的一个元素被汇总到一个窗口后立即使用它?如果一个元素可以是多个窗口的一部分,那么最终从队列中删除元素的机制是什么(“这个元素肯定不再需要了,让我们删除它以避免填满内存”)?无论如何,这绝对是可以解决的,但只需要知道你想要实现的究竟是什么。
-
一个元素可以是多个窗口的一部分,添加到原始帖子描述中,谢谢。
-
所以我是否理解正确,只要您的“队列”的第一个和最后一个元素的时间差超过 10 秒,那么可以过期最旧的条目,直到一切都适合 10秒帧(或我们决定用作最大值的任何内容?)然后您的“t2”可用于从第一个元素开始查询大小为 0-10 秒的窗口?
-
t0是物品到达的时间,t0+5秒是windows的结束时间。当 t0+5 过去时,元素熄灭,窗口滑动到下一个元素!
-
最大值基于从第一个元素日期时间开始的窗口大小。
标签: python multithreading iterator producer-consumer sliding-window