PHP-大文件查找

PHP-大文件查找

想挽留 发布于 2017-09-17 字数 101 浏览 1127 回复 5

怎么样从一个2G的大文件中查找出所有符合条件的邮箱地址,使用的内存不许超过512M,时间要尽量的短。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

归属感 2017-10-21 5 楼

首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置, 再取这一行的位置,依次类推,直到找到了$num行。

 $fp = fopen($file, "r");
$line = 10;
$pos = -2;
$t = " ";
$data = "";
while ($line > 0) {
while ($t != "n") {
fseek($fp, $pos, SEEK_END);
$t = fgetc($fp);
$pos --;
}
$t = " ";
$line = fgets($fp);
if (preg_match("/$keyword/i", $line)) $data[] = $line;
$line --;
}
fclose ($fp);
echo $data

想挽留 2017-10-13 4 楼

个人认为PHP的话只能逐行读取`进行判断
不知有没有别的插件能处理
提供shell处理办法
sed -n '/email/p' 文件
awk '/email/{print $0}' 文件
grep 'email' 文件

瑾兮 2017-10-12 3 楼

1.从文件读取一定数量的行(让内存使用量不超过512M)
2.每一行用正则进行判断是否符合条件。

晚风撩人 2017-10-01 2 楼

CC++的话,直接使用“内存映射文件”。windows下使用MapViewOfFile,Linux下使用mmap。然后使用C库StrStr查找。
1.strstr:是经过内部优化的,不用再使用字符串匹配算法(如KMP、Boyer-Moore),在某些情况KMP、Boyer-Moore查找效率并不高。
2.“内存映射文件”直接交给操作系统来处理磁盘文件到内存的映射,对大文件尤其有效。windows下使用微软提供的API,如"CreateFile"、“CreateFileMapping”、“MapViewOfFile”、“UnmapViewOfFile”来处理。

这样使用内存会非常小,肯定不会超过512M。推荐使用C来实现,PHP调用。

晚风撩人 2017-09-20 1 楼

如果数据是按行存放的数据,可以使用以下的代码实现:

function searchText($file, $keyword)
{
$result = array();
if (!$fp = fopen($file, "r")) {
die("Cannot open file $file");
}
while ($line = fgets($fp)) {
if (preg_match("/$keyword/i", $line)) $result[] = $line;

}
return $result;
}

print_r(searchText('1.php','keyword'));

另外如果你使用的是linux系统或者是支持grep的系统,强烈建议使用grep来进行查找:

$results = @exec("grep ".$search." a.log",$data);
print_r($data);