假设我有一个大文件。该文件是一个IP列表,每个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);
我的问题是:你认为还有其他更好的方法吗?
在性能方面,您认为哪些代码更快?
非常感谢你们
答案 0 :(得分:1)
答案 1 :(得分:0)
假设在某种语言中执行此操作是必需的,那么修改您的逐行代码可能是最好的,因此您不会获取超出需要的数据。
$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);
答案 2 :(得分:0)
如果您可以对文件进行排序,那么执行二进制搜索会很好。
但是,对文件进行排序需要一些时间,所以如果你进行大量的插入/删除操作,它可能不会很有效。