Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实时匹配记录_Java_Hashmap - Fatal编程技术网

Java 实时匹配记录

Java 实时匹配记录,java,hashmap,Java,Hashmap,以下是我试图实现的目标:我通过蜂窝网络发送一些数据包。我还在嗅探流量,以检查对这些数据包的响应。响应可能出现在10小时窗口内的任何地方 我发送的数据包都是唯一的(到和从),我想知道匹配数据包和响应的最佳方法 我可以创建一个hashmap,实时地将发送的每个数据包放入其中,并在返回时将其与响应进行匹配。此时,has映射条目要么留在hashmap中,要么被删除(在响应之后) 那么,现在的问题是:考虑到我们每分钟发送2000个数据包,实现这一目标的最佳方式是什么?hashmap是否足够健壮?搜索时间呢

以下是我试图实现的目标:我通过蜂窝网络发送一些数据包。我还在嗅探流量,以检查对这些数据包的响应。响应可能出现在10小时窗口内的任何地方

我发送的数据包都是唯一的(到和从),我想知道匹配数据包和响应的最佳方法

我可以创建一个hashmap,实时地将发送的每个数据包放入其中,并在返回时将其与响应进行匹配。此时,has映射条目要么留在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字节)时,我们将不得不考虑它的性能与哈希图的比较。