regex — открытие файла с php потоком

у нас есть огромный текстовый файл (около 1 гигабайта), и мы хотим искать в нем с помощью PHP,
для этого я открываю некоторую часть этого текста с некоторой веткой и ищу в этой части.
как ниже:

class AsyncFileRequest extends Thread
{   public $from_line;
public $to_line;
public $line;
public $n;
public $ans;
public $handle;
public function __construct($handle,$from_line,$to_line) {
$this->handle =$handle = @fopen($handle, 'r');
$this->from_line =$from_line;
$this->to_line =$to_line;
}
public function run() {
if (($handle = $this->handle) &&
($from_line = $this->from_line) &&
($to_line = $this->to_line)
) {
$n=0;
$ans="";
while($line=stream_get_line($handle,65535,"\n")) {

$n++;
if($n>=$from_line){
$ans.=$line;
}
if ($n == $to_line) {
break;
}
}
fclose($handle);
$this->data=$ans;
} else printf("Thread #%lu was not provided a URL<br>\n", $this->getThreadId());
}
}

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

1

Решение

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

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

Затем дождитесь завершения работы пула, и вы сможете собрать данные из задач, используя Pool :: collect.

Например:

<?php
/* A pooled task to read specific lines from a file */
class LineReader extends Collectable {

public function __construct($file, $start, $lines) {
$this->file  = $file;
$this->start = $start;
$this->lines = $lines;
}

public function run() {
/* don't write the handle to the object scope */
$handle = fopen($this->file, "r");
$line   = 1;
$count  = 0;

while (($next = fgets($handle))) {
if ($line >= $this->start) {
if ($count < $this->lines) {
$lines .= $next;
$count++;
} else break;
}
$line++;
}

$this->data = $lines;

/* close handle */
fclose($handle);

/* finished with object */
$this->setGarbage();
}
}

$pool = new Pool(8);
/* submit enough tasks to read entire file */
$pool->submit(
new LineReader(__FILE__, 1, 10));
$pool->submit(
new LineReader(__FILE__, 10, 10));
$pool->submit(
new LineReader(__FILE__, 20, 10));
$pool->submit(
new LineReader(__FILE__, 30, 10));
$pool->submit(
new LineReader(__FILE__, 40, 10));
$pool->submit(
new LineReader(__FILE__, 50, 10));
$pool->submit(
new LineReader(__FILE__, 60, 10));

/* force all reading to complete */
$pool->shutdown();

/* cleanup pool, and echo data to show working */
$pool->collect(function(LineReader $reader){
foreach(preg_split("~\n~", $reader->data) as $line) {
printf(
"%04d: %s\n", $reader->start++, $line);
}

/* allow object to be free'd */
return $reader->isGarbage();
});
?>
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]