Java 实时匹配记录
以下是我试图实现的目标:我通过蜂窝网络发送一些数据包。我还在嗅探流量,以检查对这些数据包的响应。响应可能出现在10小时窗口内的任何地方 我发送的数据包都是唯一的(到和从),我想知道匹配数据包和响应的最佳方法 我可以创建一个hashmap,实时地将发送的每个数据包放入其中,并在返回时将其与响应进行匹配。此时,has映射条目要么留在hashmap中,要么被删除(在响应之后)Java 实时匹配记录,java,hashmap,Java,Hashmap,以下是我试图实现的目标:我通过蜂窝网络发送一些数据包。我还在嗅探流量,以检查对这些数据包的响应。响应可能出现在10小时窗口内的任何地方 我发送的数据包都是唯一的(到和从),我想知道匹配数据包和响应的最佳方法 我可以创建一个hashmap,实时地将发送的每个数据包放入其中,并在返回时将其与响应进行匹配。此时,has映射条目要么留在hashmap中,要么被删除(在响应之后) 那么,现在的问题是:考虑到我们每分钟发送2000个数据包,实现这一目标的最佳方式是什么?hashmap是否足够健壮?搜索时间呢
那么,现在的问题是:考虑到我们每分钟发送2000个数据包,实现这一目标的最佳方式是什么?hashmap是否足够健壮?搜索时间呢?哈希映射肯定足够“健壮”。如果每分钟发送2000个数据包,并且假设平均响应时间为5小时,则可能有600000个数据包未完成。假设你的设备有足够的内存来存放数据包,并且你分配了一个足够大的哈希表(比如600000,负载系数为.75),那么查找速度会非常快
查看javadoc了解更多详细信息。我认为HashMap本身不够健壮,因为它不是线程安全的。我想尝试一下ConcurrentHashMap
至于更大的数据量,请寻找一些缓存实现-这些缓存通常能够溢出到磁盘,并且有时间过期,因此您可以免费获得清理 如果您有足够的内存,则不应该出现问题,前提是正确编写了映射键的
hashCode
方法,并允许以尽可能少的冲突分发潜在的1200000个键<代码>哈希映射为O(1)
但记忆可能是个问题。在最坏的情况下,您的地图中将有1200000条条目。如果每个数据包占用400字节(虽然不多,但我不知道您的数据包包含什么),那么您已经需要460 MB。HashMap是“健壮的”(从工作的意义上说)。另一个考虑因素是设备内存
让我们看看:10小时*60分钟/小时*2000包/分钟=1.200.000。对于HashMap,这意味着在32位体系结构9.600.000字节中至少有2.400.00个指针。仅针对HashMap的结构,假设没有冲突(每个冲突额外4个字节),并排除数据本身的大小(键和值)。记忆将是一个问题
与时间有关,它取决于equals()和hashCode()函数的执行量,还取决于HashMap中的冲突数(冲突数==执行equals的次数,或多或少)。没有这些数据就无法计算。服务器是一个运行在CentOS上的HP刀片服务器,内存为32 GB,因此我认为内存不会有问题。我更担心的是HashMap查找耗时太长,但感谢您提出了O(1)点。感谢您检测到这一点。我正在使用并发HashMap。说到缓存,我做了一些研究,认为MongoDB是另一种选择。当然,当映射中的条目数目可能超过1000万(例如,每个100字节)时,我们将不得不考虑它的性能与哈希图的比较。