Как разделить память между HTTP-запросами в PHP?

Я пытаюсь реализовать очень, очень большой словарный поиск, чтобы соответствовать словам в предложении в PHP. Моя первоначальная идея состояла в том, чтобы использовать алгоритм Aho-corasick, поскольку Aho-corasick решает мою точную проблему. Сначала я реализовал Trie в PHP. При кэшировании Trie создает достаточно быстрый словарь; однако, это занимает приблизительно 3 МБ памяти. Это не будет хорошо масштабироваться в PHP.

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

Если этот объект может быть разделен между всеми потоками, 3 МБ памяти незначительна, однако я не уверен в правильном способе распределения памяти между потоками в PHP.

Как я могу разделить этот объект между HTTP-запросами? Я не вижу масштабирования проекта, когда каждому потоку требуются 3 МБ служебных данных, создаваемых только Trie.

5

Решение

Я написал (разветвленный от APC и поддерживаю) APCu: Кэш общей памяти вам не поможет. Их внутренняя область хранения уже имеет определенную структуру, вы не можете ее изменить. Вы можете хранить свою структуру в виде объектов, но эти и никакие другие значения на самом деле распределяются между экземплярами PHP. APC-подобные кэши общей памяти, копирование из общей памяти для каждого контекста, запрашивающего значение.

Я написал pthreads (расширение PHP): Темы не помогут вам. Точно так же, как APC должен копировать из общей памяти, потоки должны.

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

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

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

Подходящий язык обычно означает C или C ++ для расширения PHP, но может означать и другие, если вы достаточно изобретательны.

Вы все равно не сможете нарушить правила, но вам это не нужно.

Очевидно, это зависит от вашей способности делать эти вещи.

5

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

Вы можете сделать многопоточность в php, используя PThreads.

https://github.com/krakjoe/pthreads

Он использует потоки posix и предлагает синхронизацию, пулы потоков и поддержку чтения / записи / выполнения для потоковых объектов.

Он работает на PHP7. Вот программа с двумя счетчиками, которая работает асинхронно.

<?php
$thread1 = new class extends Thread {
public function run() {
for ($i = 0; $i < 10000; $i++) {
echo "Hello thread1 ($i)\n";
}
}
};

$thread2 = new class extends Thread {
public function run() {
for ($i = 0; $i < 10000; $i++) {
echo "Hello thread2 ($i)\n";
}
}
};

$thread1->start() && $thread1->join();
$thread2->start() && $thread2->join();
?>
-3

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