Я удалил 5000 файлов, сохраненных в отдельных файлах (0-4999.txt), теперь мне нужно найти в них дублирующийся контент. поэтому я сравниваю каждый файл друг с другом во вложенном цикле (ETA 82 часа). Этот подход, безусловно, займет несколько часов. Моя главная забота здесь - нет. итераций. Может ли кто-нибудь предложить лучший подход к сокращению итераций и сокращению времени?php: найти дублирующийся контент в файлах/вложенную петлю
текущий код: НИЗ алгоритм
function ncd_new($sx, $sy, $prec=0, $MAXLEN=9000) {
# NCD with gzip artifact correctoin and percentual return.
# sx,sy = strings to compare.
# Use $prec=-1 for result range [0-1], $pres=0 for percentual,
# For NCD definition see http://arxiv.org/abs/0809.2553
$x = $min = strlen(gzcompress($sx));
$y = $max = strlen(gzcompress($sy));
$xy= strlen(gzcompress($sx.$sy));
$a = $sx;
if ($x>$y) { # swap min/max
$min = $y;
$max = $x;
$a = $sy;
}
$res = ($xy-$min)/$max; # NCD definition.
if ($MAXLEN<0 || $xy<$MAXLEN) {
$aa= strlen(gzcompress($a.$a));
$ref = ($aa-$min)/$min;
$res = $res - $ref; # correction
}
return ($prec<0)? $res: 100*round($res,2+$prec);
}
цикл по каждому файлу:
$totalScraped = 5000;
for($fileC=0;$fileC<$totalScraped;$fileC++)
{
$f1 = file_get_contents($fileC.".txt");
$stripstr = array('/\bis\b/i', '/\bwas\b/i', '/\bthe\b/i', '/\ba\b/i');
$file1 = preg_replace($stripstr, '', $f1);
// 0+fileC => exclude already compared files
// eg. if fileC=10 , start loop 11 to 4999
for($fileD=(0+$fileC);$fileD<$totalScraped;$fileD++)
{
$f2 = file_get_contents($fileD.".txt", FILE_USE_INCLUDE_PATH);
$stripstr = array('/\bis\b/i', '/\bwas\b/i', '/\bthe\b/i', '/\ba\b/i');
$file2 = preg_replace($stripstr, '', $f2);
$total=ncd_new($file1,$file2);
echo "$fileName1 vs $fileName2 is: $total%\n";
}
}
Может быть, [ 'расширение xdiff'] PECL (в HTTP : //php.net/manual/en/ref.xdiff.php) стоит посмотреть. Кажется мне, как действительный прецедент –
@Elias: проблема не в соответствующем алгоритме, а в самом цикле, но я также проверю, обеспечивает ли xdiff лучшую скорость над ncd_new(). спасибо за предложение –
Я просто понял, что разные 2 файла, и обработка diff (игнорирование _is_, _was_ и все такое) будет несколько более эффективной, чем то, что вы делаете сейчас. Или, по крайней мере: сохраните содержимое после 'preg_replace' где-нибудь (в памяти или на диске), чтобы избежать вызова' preg_replace' в тысячи раз бессмысленно –