2015-10-07 28 views
5

Próbuję zaimplementować bardzo, bardzo duże wyszukiwanie słownika, aby dopasować słowa w zdaniu w PHP. Moim początkowym pomysłem było użycie algorytmu Aho-corasick, ponieważ Aho-corasick rozwiązuje mój dokładny problem. Najpierw zaimplementowałem Trie w PHP. Trie, gdy jest buforowany, tworzy wystarczająco szybki słownik; jednak zajmuje około 3 MB pamięci. To nie będzie dobrze skalowane w PHP.Jak udostępnić pamięć między żądaniami HTTP w PHP?

Oczywiście, bez względu na strukturę danych, której używamy, duży słownik zajmie dużo pamięci o numerze. Potrzebuję tylko jednej instancji słownika, ponieważ jest statyczna i nie trzeba jej odbudowywać.

Jeśli ten obiekt może być współdzielony między wszystkimi wątkami, 3 MB pamięci jest pomijalne, jednak nie jestem pewien co do właściwego sposobu współużytkowania pamięci między wątkami w PHP.

Jak mogę udostępnić ten obiekt między żądaniami HTTP? Nie widzę skalowania projektu, gdy każdy wątek wymaga 3mb narzutów tworzonych przez Triego.

+2

PHP na ogół nie robi wątków. 'Trie' również prawdopodobnie nie jest uciążliwe. Miałeś na myśli 'Drzewo'. 3 MB to * niewiele * dla przeciętnego procesu PHP. – Evert

+5

Trie jest właściwym rzeczownikiem opisującym konkretną strukturę danych https://en.wikipedia.org/wiki/Trie –

+0

http://stackoverflow.com/a/209799/1888402 "[Nie ma wątków.] Kolejna najlepsza rzecz byłoby po prostu mieć jeden skrypt wykonać inny za pośrednictwem CLI, ale to trochę elementarne.Zależnie od tego, co próbujesz zrobić i jak skomplikowane, to może lub nie może być opcja. " - Wilco –

Odpowiedz

5

pisałem (rozwidlony z APC i utrzymania) APCu: wspólna pamięć podręczna nie zamierza pomóc. Ich wewnętrzny obszar pamięci ma już zdefiniowaną strukturę, której nie można zmienić. Możesz przechowywać swoją strukturę jako obiekty, ale te i żadna inna wartość nie są faktycznie współużytkowane przez instancje PHP. Pamięć podręczna podobna do pamięci współużytkowanej typu API, kopiuj z pamięci współużytkowanej dla każdego kontekstu żądającego wartości.

Napisałem pthreads (rozszerzenie PHP): Nici ci nie pomogą. Tak jak APC musi kopiować z pamięci współdzielonej, wątki muszą.

PHP nie jest udostępniane, cały czas, lub w inny sposób. Mógłbyś napisać kod, który wydawałby się jakby dzielił pamięć, ale nie byłby; Zasady nie mogą nigdy zostać złamane.

Nie uważam, że PHP jest rozsądnym językiem docelowym, jeśli głównym wymaganiem jest efektywność, wydawało się, że rozpoznaje to pod koniec pierwszego akapitu. Mogę się mylić, ale uzbrojony we wszystkie powyższe fakty, byłbym zaskoczony, gdybyś się nie zgodził.

Chociaż nie jest to rozsądny język, jest to prawdopodobnie rozsądna platforma . Zamierzam założyć, że chcesz użyć tego w kontekście aplikacji sieciowej, a więc są ukierunkowane na PHP, ale o wiele bardziej sensownym rozwiązaniem byłoby zaimplementowanie struktur i algorytmów w odpowiednim języku i udostępnienie go aplikacja internetowa poprzez rozszerzenie.

Właściwy język oznacza na ogół C lub C++ dla rozszerzenia PHP, ale może oznaczać inne, jeśli jesteś wystarczająco pomysłowy.

Nadal nie można złamać przepisów, ale nie trzeba tego robić.

Oczywiście zależy to od umiejętności robienia tych rzeczy.

+0

"Napisałem pthreads": * pthreads * to * wątki POSIX *, których nie napisałeś, prawda? Napisałeś moduł pthreads ** dla PHP. –

+0

Myślę, że to było jasne, ale zaktualizowana odpowiedź niezależnie od ... –

-3

Możesz wykonywać wielowątkowość w php za pomocą PThreadów.

https://github.com/krakjoe/pthreads

Wykorzystuje wątki POSIX i oferują synchronizację, baseny nici i odczytu/zapisu/wsparcia wykonywalny dla obiektów gwintowanych.

Działa na PHP7. Oto program z dwoma licznikami działającymi asynchronicznie.

<?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(); 
?> 
+0

Wielowątkowość nie pomoże, ponieważ OP musi również utrzymywać obiekt w pamięci pomiędzy żądaniami. Projekt PHP nie ma (domyślnie) funkcji trwałości poza stanem sesji, który jest serializowany na dysk (wolny). Nie ma wbudowanych możliwości przechowywania obiektów-wykresów w pamięci między żądaniami. – Dai

+0

@Dai - Błędem jest założenie, że model wątkowania powinien zawsze działać w różnych sesjach. Model może być również taki, że można utworzyć wiele wątków w jednej sesji i obsługiwać jednocześnie trzy procesy. –