2012-05-10 50 views
7

Ho un grande set di dati di argomenti filosofici, ognuno dei quali si collega ad altri argomenti come prova o smentita di una determinata istruzione. Una dichiarazione di base può avere molte prove e contrasti, ognuno dei quali può anche avere prove e confutazioni. Le dichiarazioni possono anche essere utilizzate in più grafici e i grafici possono essere analizzati in un "contesto dato" o ipotesi.Utilizzare le goroutine di Google Go per creare una rete Bayes

Ho bisogno di costruire una rete bayesiana di argomenti correlati, in modo che ogni nodo propaghi l'influenza in modo equo e preciso ai suoi argomenti connessi; Devo essere in grado di calcolare la probabilità di catene di nodi connessi contemporaneamente, con ogni nodo che richiede ricerche di datastore che devono bloccare per ottenere risultati; il processo è prevalentemente limitato all'I/O e la mia connessione al datastore può essere eseguita in modo asincrono in java, go e python {google appengine}. Una volta che ogni ricerca è completata, propaga gli effetti su tutti gli altri nodi connessi fino a quando il delta di probabilità non scende al di sotto di una soglia di irrilevanza {attualmente allo 0,1%}. Ogni nodo del processo deve calcolare catene di connessioni, quindi riassumere tutti i risultati in tutte le query per regolare i risultati di validità, con i risultati concatenati verso l'esterno per qualsiasi argomento connesso.

Per evitare di ricorrere all'infinito, stavo pensando di usare un processo di tipo A * nelle goroutine per propagare gli aggiornamenti alle mappe degli argomenti, con un'euristica basata sull'influenza di composti che ignora i nodi una volta che la probabilità di influenza si abbassa sotto, diciamo 0,1%. Ho provato a impostare i calcoli con trigger SQL, ma è diventato troppo complesso e disordinato troppo velocemente. Poi mi sono spostato su google appengine per sfruttare il nosql asincrono, ed era meglio, ma ancora troppo lento. Devo eseguire gli aggiornamenti abbastanza velocemente per ottenere un'interfaccia utente scattante, quindi quando un utente crea o vota a favore o contro una dimostrazione o una contestazione, può vedere immediatamente i risultati riflessi nell'interfaccia utente.

Penso che Go sia il linguaggio scelto per supportare la concorrenza di cui ho bisogno, ma sono aperto a suggerimenti. Il client è un'app javascript monolitica che utilizza solo XHR e websocket per spingere e tirare le mappe degli argomenti {e i loro aggiornamenti} in tempo reale. Ho un prototipo Java che può calcolare catene di grandi dimensioni in 10 ~ 15 secondi, ma il monitoraggio delle prestazioni mostra che gran parte del mio runtime è sprecato in sincronizzazione e sovraccarico da ConcurrentHashMap.

Se ci sono altre lingue altamente concorrenti che vale la pena provare, per favore fatemelo sapere. Conosco java, python, go, ruby ​​e scala, ma imparerò qualsiasi lingua se si adatta alle mie esigenze.

Analogamente, se esistono implementazioni open source di enormi reti bayesiane, si prega di lasciare un suggerimento.

+0

Un'applicazione interessante, ma qual è esattamente la tua domanda? – Sonia

+0

Beh, nello specifico, voglio sapere se esistono standard di settore/precedenti per il calcolo di enormi reti bayesiane e se le goroutine siano o meno ottimizzate per questo lavoro come sembrano. – Ajax

risposta

4

Penso che sia un po 'difficile dire quello che stai chiedendo. Forse puoi elaborare la tua domanda.

Le goroutine sono abbastanza economiche e si adattano perfettamente alle moderne applicazioni Web che utilizzano XHR o Websocket pesantemente (e altre applicazioni con I/O che devono attendere le risposte del database e cose del genere). Inoltre, go runtime è anche in grado di eseguire queste goroutine in parallelo, in modo che Go sia anche adatto per compiti legati alla CPU, che dovrebbero trarre vantaggio da più core e dalla velocità di un linguaggio compilato in modo nativo.

Ma dovresti anche tenere a mente che goroutine e canali non sono gratuiti. Richiedono ancora una certa quantità di memoria e ogni punto di sincronizzazione (ad esempio un canale di invio o di ricezione) ha il suo costo. Normalmente non è un problema, dal momento che la sincronizzazione, ad esempio, rispetto ad una query di database, è estremamente economica, ma potrebbe non essere adatta per costruire reti Bayesiane efficienti, specialmente se il lavoro effettivo di ogni goroutine/nodo è trascurabile rispetto a il sovraccarico di sincronizzazione.

Il tuo obiettivo principale per ogni programma concorrente dovrebbe essere quello di evitare la mutabilità condivisa il più possibile.Quindi una rete bayesiana modellata con goroutine e canali potrebbe essere un buon esempio educativo e un ottimo modo per misurare le prestazioni dell'implementazione del canale di Go, ma probabilmente non è la soluzione migliore per il tuo problema.

+2

... ma meglio dei trigger SQL, dovrei pensare. – Sonia

+0

Il lavoro effettivo di ciascun nodo della rete bayesiana richiederà ricerche di datastore seguite da calcoli e potenzialmente più ricerche di datastore fino a quando la probabilità propagata scende al di sotto di una soglia di irrilevanza {0,1% attualmente}. Ogni ricerca di datastore richiede il blocco, quindi i calcoli stessi sono abbastanza economici, ma la concorrenza e la sincronizzazione sono piuttosto costose. Ho un prototipo java asincrono che può essere completato in ~ 10 secondi, un tempo che non riesco a tagliare, anche con più thread che eseguono più query contemporaneamente {thread java = too heavyweight}. – Ajax

+0

aggiornerò la domanda per riflettere il fatto che il processo è principalmente legato all'I/O; e lo implementerò in go e riferirò ogni risultato/benchmark delle prestazioni. – Ajax

Problemi correlati