优化:许多关键更新流,少量密钥

时间:2016-04-14 14:03:09

标签: optimization data-structures hash hashtable hashset

我有一个接收恒定数据流的程序。

从这个数据流中我填充哈希表。我收到的每一条数据 翻译成:或者

  • 密钥更新;
  • 密钥插入(如果尚不存在)。

我将传入的原始数据存储在队列中,然后再进行处理。

哈希表中的键数非常少。我收到99%的数据 对应密钥更新

问题是我有很多关键更新,队列变成了 对我的消费者来说太大了

显然,从成千上万的关键更新来看,其中许多都是关注的 key,所以只有最后一个具有真正的价值而其他所有的都没用。

处理此案件的最佳方式是什么?我应该使用哪种数据结构 正在使用?

  

您能告诉我们您的钥匙有什么问题?那里有多少?它们是数字的(如果是这样,它们可能采用什么范围的值?),文本?每个键的字节数有限制吗?你要插入什么样的哈希表(例如封闭散列,开放散列)?哈希表上有什么争用/锁定?每秒多少次更新?你使用什么编程语言?

多少把钥匙

几百甚至几千。不是很多!

数字键

键本身是字母数字,它们不是很长,最多约30个字符。但是,这些值都是数字(整数)。

限制每个键的字节数

我的密钥长度最多为30个字符。

哈希表的种类

我只是使用Python的defaultdict

争用/锁定

Python的字典被认为是线程安全的

每秒更新次数

它可以从每3秒1次增加到每秒超过100次

编程语言

我正在使用python

2 个答案:

答案 0 :(得分:1)

您可以使用另一个哈希表,而不是使用简单队列 - 每个传入的消息都可以基于密钥存储在适当的堆栈中。然后从每个堆栈中取出每个元素(这将是最新的项目) - 当您拉出项目时,可以选择清除每个堆栈。

答案 1 :(得分:0)

ConcurrentDictionary应该很好地适应这个法案。

但是你需要的是一种(可能是自适应的)限制机制,它可以检测队列何时太慢并开始折叠数据。