Corro text-processing e il suo associato NLP APIs e utilizza circa 2 dozzine di diversi modelli in salamoia, che vengono caricati da un'applicazione Django (gunicorn dietro nginx). I modelli vengono caricati non appena sono necessari e, una volta caricati, rimangono in memoria. Ciò significa che ogni volta che riavvio il server gunicorn, le prime richieste che richiedono un modello devono attendere alcuni secondi per il caricamento, ma ogni richiesta successiva ottiene l'utilizzo del modello già memorizzato nella RAM. Il riavvio avviene solo quando distribuisco nuove funzionalità, che di solito comporta l'aggiornamento dei modelli, quindi ho bisogno di ricaricarli comunque. Quindi, se non ti aspetti di apportare modifiche al codice molto spesso e non hai requisiti elevati in termini di richieste coerenti, probabilmente non hai bisogno di un demone separato.
Oltre al tempo di caricamento iniziale, il fattore limitante principale è la memoria. Attualmente ho solo 1 processo di lavoro, perché quando tutti i modelli vengono caricati in memoria, un singolo processo può richiedere fino a 1 GB (YMMV, e per un singolo file pickle da 11 MB, i requisiti di memoria saranno molto più bassi). L'elaborazione di una singola richiesta con un modello già caricato è abbastanza veloce (di solito < 50ms) che attualmente non ho bisogno di più di 1 operatore e, se lo faccio, la soluzione più semplice è quella di aggiungere abbastanza RAM per eseguire più processi di lavoro.
Se si è preoccupati per la memoria, quindi esaminare in scikit-imparare, poiché i modelli equivalenti possono utilizzare una memoria molto meno di NLTK. Ma non sono necessariamente più veloci o più accurati.
In primo luogo, stai usando Python 2? Se è così, stai usando 'pickle' o' cPickle'? Passare a 'cPickle' (o a Python 3, dove le due implementazioni sono unite in un singolo modulo) potrebbe trasformare i tuoi pochi secondi in poche decine di millisecondi. In alternativa, se è necessario utilizzare lo stesso tagger per tutte le richieste, perché caricarlo per ogni richiesta? Caricalo una volta (o una volta per processo, o qualsiasi altra cosa - non conosco Pyramid), e quindi non importa quanto tempo ci vuole. – abarnert
Per prove su quanto sopra, provare questo: 'p = cPickle.dumps (intervallo (1250000)); print timeit.timeit (lambda: pickle.loads (s), number = 1); print timeit.timeit (lambda: cPickle.loads (s), number = 1) '. Ottengo 4,96 vs 0,35 sul mio sistema. – abarnert
Sto usando Python 2 e normale pickle. Daremo un'occhiata a cPickle. Sì, non ero del tutto sicuro del modo migliore per caricare il file. Devo esaminare le opzioni di caricamento per Pyramid – abroekhof