Могу ли я разделить большой массив памяти между процессами PHP?

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

Я делаю извлечение сущностей с помощью процесса PHP, который загружает массив, содержащий ngrams, для поиска в памяти. Этот массив использует 3 ГБ памяти, и его загрузка занимает около 20 секунд каждый раз, когда я запускаю процесс. Я генерирую его один раз локально на машине, и каждый процесс загружает его из файла .json. Затем каждый процесс токенизирует текст, который он обрабатывает, и выполняет array_intersect между этими двумя массивами для извлечения сущностей.

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

Поскольку это, вероятно, невозможно с PHP: какой тип языков/методов я должен исследовать, чтобы сделать такое извлечение сущностей более эффективным?


person T. Brian Jones    schedule 05.09.2014    source источник
comment
Я бы начал с решений БД в памяти.   -  person raina77ow    schedule 06.09.2014
comment
Будет ли поиск в таблице MySQL in MEMORY, содержащей эти энграммы, сопоставимым по скорости с поиском в массиве в PHP? Вероятно, это... не знаю, пока не проверишь... ситуацию.   -  person T. Brian Jones    schedule 06.09.2014


Ответы (2)


Если массив никогда не модифицируется после загрузки, вы можете использовать pcntl_fork() и создать несколько копий скрипта. С семантикой копирования при записи все они будут считываться из одной и той же копии массива в памяти.

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

person Marc B    schedule 05.09.2014

В вашем случае лучшим способом обмена может быть доступ к mmap только для чтения.

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

mmap очень элегантный. Но, тем не менее, работа с такими отображаемыми данными в PHP, скорее всего, будет мучительной и медленной. В целом PHP медленный. В бенчмарках обычно видно, что PHP работает в 40-50 раз быстрее, чем хорошая программа на C. Это намного хуже, чем, например. Java, где хорошая программа на Java всего в два раза медленнее высокооптимизированного C; здесь может оказаться выгодным иметь мощные инструменты разработки Java, а не отлаживать низкоуровневый код C. Но у PHP нет никакого ключевого преимущества: он не элегантен для написания, у него нет превосходной цепочки инструментов, и он не быстрый...

person Has QUIT--Anony-Mousse    schedule 06.09.2014