самый быстрый способ узнать, найдена ли строка в файле? - PullRequest
3 голосов
/ 16 мая 2011

Допустим, у меня есть большой файл. Файл представляет собой список IP-адресов, каждый в новой строке, например:

123.123.123.123
123.123.123.124
123.123.123.125
etc...

Я мог бы сделать это так:

$file = file_get_contents($src);    
if (substr_count($file,'myip'))
    echo 'FOUND';

Или аналогичным способом со стилем массива:

$file = file($src,FILE_IGNORE_NEW_LINES);
if (in_array('myip',$file))
    echo 'FOUND';

Но я думаю, есть третий вариант, который может быть быстрее.
Разбор файла построчно и, конечно, остановка чтения, если строка найдена.

Примерно так:

$file = fopen($src,'r');
while(!feof($file)) { 
    $ip = fgets($file);
    if ($ip == $myIP) {
        die('Found');
    }   
}
fclose($file);

У меня такой вопрос: как вы думаете, есть другой лучший способ?

А с точки зрения производительности, какой код, по вашему мнению, быстрее?

Большое спасибо, ребята

Ответы [ 3 ]

1 голос
/ 16 мая 2011

Если можете, рассмотрите возможность использования grep или find. Это может быть быстрее и, что более важно, более эффективно использовать память, чем PHP.

0 голосов
/ 17 мая 2011

Если вы можете сохранить файл отсортированным, тогда выполнение двоичного поиска будет работать хорошо.

Однако сортировка файла займет некоторое время, поэтому, если вы делаете много вставок / удалений, он может не сработать.быть очень эффективным.

0 голосов
/ 16 мая 2011

Предполагая, что выполнение этого на языке является обязательным требованием, модификация вашего построчного кода, вероятно, будет лучшей, так что вы не собираете больше данных, чем вам нужно.

$file = fopen($src,'r');
while(!feof($file)) { 
    $ip = fgets($file);
    if ($ip == $myIP) {
        echo 'FOUND!';
        break; // dieing here won't close the file
    }   
}

fclose($file);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...