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.
Un'applicazione interessante, ma qual è esattamente la tua domanda? – Sonia
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