问题有点长,请耐心阅读。
我正在编写Java代码,将全天网络跟踪中的流聚合到每个子网的84秒时间段中。目前,我最多有256个子网和1024个子网的时间段。我使用这个来获取流量特征统计数据,例如每个子网每个窗口的连接数、输入/输出字节数、每个窗口的外部IP地址数量。虽然连接、输入/输出字节很简单,但获取唯一的外部IP地址数量会导致OutOfMemory错误。
为了确定唯一的外部IP地址数量,我需要将IP地址存储在某些数据结构(如哈希表)中,并在跟踪结束时获取此哈希表的大小。这意味着我将有1024*256个哈希表,每个哈希表都存储大量的12-15字节IP地址字符串(数十到数千个)。这很快就会爆炸,系统会因内存不足而崩溃(我已经尝试将Java堆大小设置为最多2GB,但没有效果)。有人能建议一种有效地存储如此多的对象的方法吗?
我尝试使用位集(将IP转换为int),但考虑到IP地址非常稀疏,它对内存情况没有帮助。作为最后的手段,我可能会使用colt库稀疏矩阵,每个double存储多达64个IP地址,但我想听听意见,以防我遗漏了一些明显的东西,可以节省编写/调试这样一个包装器的时间。
附注:为了了解规模,我看到每个跟踪中有数亿个流,我解析和聚合这些流。在大多数情况下,我使用256个子网中的10到20个,但我希望解决方案可扩展到所有256个子网。
int[256] [] [] []
只占用了256个指针所需的空间)。 - kdgregory