【发布时间】:2014-08-20 03:42:35
【问题描述】:
我正在解析两个包含 IP 地址的 CSV 文件。 第一个是源 CSV,第二个是“黑名单”。
由于源文件的大小,我正在尝试优化查找与黑名单匹配的 IP 地址的速度。
编辑:黑名单由 IP 地址“块”组成。这意味着黑名单中的每条记录都有两个 IP 地址:一个Start Block(例如 216.254.128.0)和一个End Block。 (例如 216.254.223.255)
这意味着直接查找等将不起作用。
我想知道解决这个问题的最佳方法是什么。蛮力方法是:
String[] parts = sourceIP.split("\\."); // String array, each element is text between dots
int hi = 255;
int lo = 0;
int mid = (hi - lo) / 2 ;
if (Integer.valueOf(parts[0]) > mid) {
mid = lo;
}
然后我可以对每个part 重复此操作,以确定 IP 地址是否在黑名单中。
这似乎非常激进,并且有 4k+ 记录,这可能需要非常非常长的时间。
确定每个部分可能需要 10 多次迭代,然后必须重复检查黑名单中 IP 块的“高”部分。这是每条记录 80 多次迭代。
我希望在这里获得一些意见,以了解比较 IP 地址的最佳方法。
你有什么想法?
是否可以使用快速按位掩码通过序列化INetAddress 来快速比较值?
文件结构说明:
源IP文件:
包含来自数据库的记录列表。 (大约 4k)。每条记录都包含姓名、地址、电子邮件和 IP 地址。
黑名单:
包含 4.2k 条记录。每条记录都是一个 IP 地址“块”。这由两个 IP 地址组成。 1. 开始和 2. 结束。
如果源列表中的记录具有在黑名单中找到的 IP 地址,我需要保存该记录并将其添加到新文件中。
【问题讨论】:
-
我不明白这段代码的用途。
-
我目前没有使用该代码。这是一种简单的整数搜索方法,用于“查找”值在数组中的位置。我会用它来查看该值是否存在(它在黑名单中的某处找到),或者您是否最终位于两条记录之间并且源 IP 地址也不匹配。如果是这种情况,则该 IP 地址不存在于黑名单中。正如我所说,这是一种相当蛮力的方法,我希望找到更好的解决方案。
-
您有什么理由必须将这些 IP 存储在一个文件中?似乎有更好的方法来存储这么多记录
-
黑名单有多大?如果它不是太大,只需将其加载到内存中,将 IP 地址转换为整数,然后排序。然后,您可以从源文件中加载每个地址,将其转换为整数,然后在黑名单上进行二进制搜索。或者,您可以从黑名单条目创建字典并进行直接查找。
-
对 4.2K 记录进行二进制搜索将需要 最多 12 次探测。因此,您正在谈论总共 50,000 次查找,以检查您的所有记录。这将需要不到一秒钟的时间。从文件中读取源记录的时间比搜索要长。
标签: android algorithm ip-address