Есть ли способ сохранить в памяти неизменную структуру данных размером 200 МБ и получить к ней доступ из скрипта? - PullRequest
2 голосов
/ 10 октября 2009

У меня есть список из 9 миллионов IP-адресов, и с помощью набора хеш-таблиц я могу создать функцию постоянного времени, которая возвращает значение, если в этом списке есть определенный IP-адрес. Могу ли я сделать это на PHP? Если да, то как?

Ответы [ 5 ]

4 голосов
/ 10 октября 2009

Для меня это звучит как идеальное приложение для фильтра Блума. Посмотрите на предоставленные ссылки, которые могут помочь вам сделать это как можно скорее.

  1. http://github.com/mj/php-bloomfilter
  2. http://code.google.com/p/php-bloom-filter/
2 голосов
/ 10 октября 2009

Интересным в этом вопросе является количество направлений, по которым вы можете идти.

Я не уверен, что кэширование - ваш лучший вариант просто из-за большого набора данных и относительно небольшого числа запросов к нему. Вот несколько идей.

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.
}
?>
2 голосов
/ 10 октября 2009

Если чтение файла в sqlite было бы вариантом, вы могли бы извлечь выгоду из индексов, тем самым ускоряя поиск?

В противном случае memcached - это вариант, но я не знаю, как будет проходить проверка на существование, если вы сделаете это с чистым поиском php (довольно медленно, я думаю)

2 голосов
/ 10 октября 2009

Я думаю, что выбросить его в memcache, вероятно, будет ваш лучший / самый быстрый метод.

1 голос
/ 03 января 2010

Вы пробовали решение NoSql, например Redis ? Весь набор данных управляется в памяти.

Вот некоторые тесты .

...