【问题标题】:How can I keep a list of recently seen users without running out of RAM/crashing my DB?如何在不耗尽 RAM/使数据库崩溃的情况下保留最近查看的用户列表?
【发布时间】:2011-02-14 05:19:10
【问题描述】:

这里有一些代码应该展示我正在尝试做的事情:

current_time  = datetime.datetime.now()
recently_seen = []

user_id = 10

while True:
    if user_id not in recently_seen:
        recently_seen[user_id] = current_time

        print 'seen {0}'.format(user_id)
    else:
        if current_time - recently_seen[user_id] > '5 seconds':
            recently_seen[user_id] = current_time

            print 'seen {0}'.format(user_id)

    time.sleep(0.1)

基本上,我的程序正在为用户侦听套接字。这被包裹在一个循环中,当它看到它们时会吐出user_ids。这意味着,我每隔几毫秒就会看到一次 user_id。

我想要做的是记录它看到的用户以及在什么时间。说它在 0.1 秒看到一个用户,然后在 0.7 秒又看到一个用户是愚蠢的。所以我想实现一个 5 秒的缓冲区。

它应该找到一个用户,如果在 5 秒内没有看到该用户,则将其记录到数据库中。

我想出的两个解决方案是:

1) 将 user_id 保存在字典中(类似于上面的示例代码)并检查。问题是,如果它运行了几天并继续寻找新用户,这最终会耗尽我的内存 2)将它们记录到数据库并检查。问题在于,它每隔几毫秒就会找到用户。我不想每隔几毫秒读取一次数据库...

我需要一些方法来创建一个有限大小的列表。该限制将是 5 秒。关于如何实现这一点的任何想法?

【问题讨论】:

    标签: python list dictionary time login


    【解决方案1】:

    将用户登录到数据库后如何从字典中删除?

    【讨论】:

    • 我……没想到._.
    • 好的,我刚刚意识到为什么这不起作用。如果我将用户登录到数据库并将其从字典中删除,我将无法检查“上次看到时间”与下一次看到它的时间(几毫秒后)。
    • 更改此部分:else: if current_time - recent_seen[user_id] > '5 seconds': recent_seen[user_id] = current_time print 'seen {0}'.format(user_id) 仅删除用户你的清单。下次将它们添加到列表中时,它们也会被记录。然后它们将在 5 秒内不被记录,它们将被删除,当您再次看到它们时,它们会被添加并记录。
    【解决方案2】:

    你为什么不使用DBM? 它将像字典一样工作,但会存储在磁盘上。

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      相关资源
      最近更新 更多