2015-10-07 17 views
5

Sto cercando di implementare una ricerca del dizionario molto, molto grande per abbinare le parole in una frase in PHP. La mia idea iniziale era di usare l'algoritmo Aho-corasick, poiché l'Aho-corasick risolve il mio problema esatto. In primo luogo ho implementato un Trie in PHP. Il Trie, quando memorizzato nella cache, crea un dizionario sufficientemente veloce; tuttavia, occupa circa 3mb di memoria. Questo non sta andando bene in PHP.Come condividere la memoria tra richieste HTTP in PHP?

Ovviamente, non importa la struttura dati che usiamo, un grande dizionario occuperà molto di memoria. Ho solo bisogno di una singola istanza del dizionario, poiché è statica e non sarà necessario ricostruirla.

Se questo oggetto può essere condiviso tra tutti i thread, 3mb di memoria è trascurabile, tuttavia, non sono sicuro del modo corretto di condividere la memoria tra i thread in PHP.

Come posso condividere questo oggetto tra richieste HTTP? Non riesco a vedere il ridimensionamento del progetto quando ogni thread richiede un sovraccarico di 3mb creato solo dal Trie.

+2

PHP generalmente non esegue il threading. Anche 'Trie' probabilmente non si arrichisce. Intendevi 'Tree'. 3MB è * non molto * per il processo medio di PHP. – Evert

+5

Trie è un nome proprio che descrive una particolare struttura di dati https://en.wikipedia.org/wiki/Trie –

+0

http://stackoverflow.com/a/209799/1888402 "[Non c'è threading.] La prossima cosa migliore sarebbe semplicemente avere uno script eseguirne un altro tramite CLI, ma è un po 'rudimentale, a seconda di cosa si sta tentando di fare e di quanto sia complessa, questa potrebbe essere o meno un'opzione ". - Wilco –

risposta

5

ho scritto (biforcuta da APC e mantenere) APCu: La cache di memoria condivisa non sta andando per aiutarvi. La loro area di memoria interna ha già una struttura definita, non è possibile modificarla. Puoi memorizzare la tua struttura come oggetti, ma questi, e nessun altro valore, sono effettivamente condivisi tra le istanze di PHP. Memoria cache apc a memoria condivisa, copia fuori dalla memoria condivisa per ogni contesto che richiede il valore.

Ho scritto pthreads (estensione PHP): I thread non ti aiuteranno. Proprio come l'APC che deve copiare dalla memoria condivisa, i thread devono.

PHP non viene condiviso nulla, tutto il tempo, oppure si rompono le cose. Potresti scrivere un codice che sembrava come se stesse condividendo la memoria, ma non lo sarebbe; Le regole non devono mai essere rotte.

Non credo che PHP sia un linguaggio obiettivo adatto se un requisito primario è l'efficienza, sembravi riconoscere questo alla fine del primo paragrafo. Potrei sbagliarmi, ma armati di tutti i fatti di cui sopra, sarei sorpreso se non sei d'accordo.

Mentre non è un linguaggio ragionevole, è una piattaforma discutibilmente ragionevole. Presumo che tu voglia usare questo in un contesto di applicazione web, e così lo scopo è il targeting per PHP, ma una cosa molto più sensata da fare sarebbe implementare le strutture e gli algoritmi in un linguaggio adatto, e esporlo al tuo applicazione web tramite un'estensione.

Lingua appropriata indica generalmente C o C++ per un'estensione PHP, ma può significare altri, se si è abbastanza creativi.

Non si sarebbe ancora in grado di infrangere le regole, ma non sarebbe necessario.

Ovviamente questo si basa sulla tua capacità di fare quelle cose.

+0

"Ho scritto pthreads": * pthreads * è * thread POSIX * che non hai scritto, vero? Hai scritto il modulo ** di pthreads per PHP. –

+0

Avrei pensato che fosse chiaro, ma risposta aggiornata qualunque ... –

-3

È possibile eseguire il multithreading in php utilizzando PThreads.

https://github.com/krakjoe/pthreads

utilizza thread POSIX e sincronizzazione offerta, piscine filo e lettura/scrittura/supporto eseguibile per oggetti filettati.

Funziona su PHP7. Ecco un programma con due contatori che viene eseguito in modo asincrono.

<?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

Il multi-threading non è d'aiuto in quanto l'OP deve anche mantenere l'oggetto in memoria tra le richieste. Il design di PHP non ha (di default) funzionalità di persistenza a parte lo stato di sessione che viene serializzato su disco (lento). Non esiste una disposizione integrata per la memorizzazione dei grafici degli oggetti in memoria tra le richieste. – Dai

+0

@Dai - È sbagliato presumere che il modello di threading debba sempre funzionare tra le sessioni. Il modello può anche essere tale che più thread possano essere creati all'interno di una singola sessione e gestire tre processi contemporaneamente. –