Possiedo un'app Node che accede a una struttura di dati statica, grande (> 100 M), complessa, in memoria, accetta le query e fornisce quindi piccole fette di tali dati al client su HTTP.C'è un modo per condividere la memoria tra worker/thread/qualcosa in Node.JS?
Alla maggior parte delle domande è possibile rispondere in decimi di secondo. Evviva il nodo!
Tuttavia, per alcune query, la ricerca di questa struttura dati richiede alcuni secondi. Questo fa schifo perché tutti gli altri devono aspettare.
Per servire più clienti in modo efficiente, vorrei utilizzare una sorta di parallelismo.
Ma, dato che questa struttura dati è così grande, mi piacerebbe condividerla tra i lavoratori o i thread o cosa hai, quindi non masterizzo centinaia di megabyte. Questo sarebbe perfettamente sicuro, perché la struttura dei dati non verrà scritta. Un tipico 'fork()' in qualsiasi altra lingua lo farebbe.
Tuttavia, per quanto posso dire, tutti i metodi standard per eseguire il parallelismo nel nodo lo rendono esplicitamente impossibile. Per sicurezza, non vogliono che tu condivida nulla.
Ma c'è un modo?
Background:
Non è pratico di mettere questa struttura dati in un database, o utilizzare memcached, o qualcosa di simile.
Le librerie API di WebWorker e simili consentono solo di inoltrare i messaggi in serie brevi agli operatori.
Cluster di nodi utilizza una chiamata denominata "fork", ma non è realmente un fork del processo esistente, ne genera uno nuovo. Quindi ancora una volta, nessuna memoria condivisa.
Probabilmente la risposta più corretta sarebbe utilizzare un accesso simile a un file system alla memoria condivisa, ovvero tmpfs o mmap. Ci sono alcune librerie di nodi che rendono mount() e mmap() disponibili esattamente per qualcosa del genere. Sfortunatamente, si deve implementare un complesso accesso alla struttura dati oltre a ricerche e letture sincrone. La mia applicazione utilizza matrici di matrici di dicts e così via. Sarebbe bello non dover reimplementare tutto ciò.
Non puoi anticipare la ricerca (utilizzando 'process.nextTick' forse) in modo da non bloccare il resto? – robertklep
'Non è pratico mettere questa struttura dati in un database, o usare memcached, o qualcosa del genere. Il cosa ?? Da quando? – freakish
strambo: Stiamo controllando se ogni elemento è un sottoinsieme di una query. Immagina di avere una stringa "fooquux" e vogliamo verificare se "ox" è in quella stringa. Non c'è modo che io sappia di farlo in modo efficiente con le normali operazioni di database. Ma è super facile se puoi accedervi come una normale struttura dati. Quindi un gran numero di questi sono ordinati e classificati e questi sono "puntatori" a più dati, ancora poco pratici a meno che non li abbiamo in una struttura di dati. – NeilK