2

我有一个包含 900 万个 IP 的列表,并且使用一组哈希表,我可以创建一个恒定时间函数,如果特定 IP 在该列表中,则返回该函数。我可以用 PHP 做吗?如果是这样,怎么做?

4

5 回答 5

4

这对我来说听起来像是一个理想的布隆过滤器应用程序。查看提供的链接,这些链接可能会帮助您尽快完成。

  1. http://github.com/mj/php-bloomfilter
  2. http://code.google.com/p/php-bloom-filter/
于 2009-10-09T20:28:40.927 回答
2

我认为把它扔进内存缓存可能是你最好/最快的方法。

于 2009-10-09T20:14:09.770 回答
2

如果将文件读入 sqlite 是一种选择,您可以从索引中受益,从而加快查找速度?

否则,memcached 是一个选项,但我不知道如果您使用纯 php 查找来检查是否存在(我的猜测相当慢)

于 2009-10-09T20:40:40.533 回答
2

这个问题的有趣之处在于你可以去多少个方向。

我不确定缓存是否是您的最佳选择,仅仅是因为大量数据和相对较少的查询。这里有一些想法。

1)建立一个内存盘。链接您的 mysql 数据库表以使用 ramdisk 分区。我从来没有尝试过,但尝试一下会很有趣。

2) Linux 通常有一个非常快的文件系统。构建一个结构化的文件系统,将记录分解为文件,然后调用 file_get_contents() 或 file_exists()。当然,这个解决方案需要您构建和维护文件系统,这也很有趣。rsync 可能有助于使您的实时文件系统保持最新。

例子:

/002/209/001/299.txt

<?
$file = $this->build_file_from_ip($_GET['ip']);
if(file_exists($file)) {
    // Execute your code.
}
?>
于 2009-10-09T21:04:31.920 回答
1

您是否尝试过像Redis这样的 NoSql 解决方案?整个数据集在内存中进行管理。

这里有一些基准

于 2010-01-03T15:32:27.327 回答