减少内存占用的 Java 集

标签 java set compression

问题如下: 我们正在开发 Java 客户端-服务器产品,需要通过过滤进行 DDoS 保护。 每个请求都包含客户端 ID。 如果服务器在短时间内收到过多的客户端请求,客户端的ID就会被添加到黑名单中。 服务器过滤请求,如果id在黑名单中,则请求被忽略。

内存消耗是一个问题。需要尽量减少黑名单消耗的内存。

使用HashSet或TreeSet是不合适的。

是否有一个Java库可以实现这样一种集合,其中内存占用小于num_elements * size_of_element?可能吗?

或者如果不可能,什么是具有最小内存占用的 Java set 实现?

最佳答案

Is there a Java library that implements such a kind of set, where memory footprint is smaller than num_elements * size_of_element?

我不知道有这样的库。

Is it possible?

理论上是的。您可以使用某种形式或压缩来表示一组客户端 IP 地址,其空间小于 N * sizeof(IP 地址)。

但是...

您需要的其他东西(我想)是快速 IP 地址查找和快速 数据更新。这使得这是一个困难的问题,特别是如果您尝试使用 Java 进行编码,而 Java 并不是实现最小内存数据结构的好语言。

<小时/>

实际上,还有另一种方法可以控制内存使用。使用将 accessOrder 设置为 true 创建的 LinkedHashMap。这会导致输入的映射按 LRU 顺序排序。然后,每次向 map 添加条目时,请检查它是否太大。如有必要,删除第一个条目...最近最少使用的条目。

关于减少内存占用的 Java 集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28383250/

相关文章:

java - JPanel 位于另一个 JPanel 之上

java - JTable 在 GUI 中为空,控制台显示已填充的 DefaultTableModel

javascript - 在 JavaScript 中创建集合的方法?

algorithm - 如何获得 bzip2 发现的模式? (或任何其他压缩算法)

algorithm - 将原始轨迹与两个压缩轨迹进行比较的最佳方法是什么

c++ - 如何在 C++ 中使用 libbz2 压缩目录

java - Cobertura 覆盖忽略 maven 项目中的注释?

java - 管理maven不同的cglib/asm版本

python - 在python中从另一个列表中删除一个列表中存在的项目

java - 无法从集合中删除整数