Aggiunta trasparente di un livello di interfaccia del database

1

Attualmente sto cercando modi per ottimizzare un'applicazione che sta consumando quantità di memoria inaccettabili.

Il processo prende sostanzialmente input e lo analizza in un albero. L'albero è attualmente memorizzato. Per un input medio, può consumare da 100 MB a 2 GB di memoria. Per input più grandi, può consumare fino a 6 GB, che è più di quello che la maggior parte delle nostre macchine può gestire se volessimo testarlo localmente. Abbiamo paura che in futuro ci saranno ancora più grandi input e quindi è il momento di trovare una soluzione più scalabile.

Invece di archiviare tutto in memoria, vorrei spostare l'albero o parti dell'albero nella memoria esterna. Il benchmarking degli effetti di non memorizzare alcune parti dell'albero nella memoria ha comportato una riduzione del 90% del consumo di memoria.

Abbiamo un framework (beh, solo la nostra libreria) che ci permette di lavorare con l'albero usando un insieme di metodi getter e accessor standard. Utilizziamo metodi standardizzati per la creazione, la lettura, l'aggiornamento e l'eliminazione dei nodi.

I nostri parser in genere interagiscono direttamente con i nodi. Ad esempio, un metodo di esempio potrebbe dire

// Takes some data and updates the tree with new data
private void managePerson(String id) {

  // this returns a node with the given ID, or creates one if it doesn't exist yet
  // and returns a reference to it
  NodePerson node = getPerson(id) 

  // add or update some attributes
  node.age.set(25)
  node.name.set("John")

  // add some points to the existing value
  int points = node.points.get()
  node.points.set(points + 5)
}

Data questa informazione, sto pensando di usare un database. Tuttavia, vorrei anche essere in grado di implementare le modifiche in modo trasparente in modo da non influenzare il valore decennale del codice che si basa sull'albero.

Che cosa posso utilizzare che mi consentirà di estrarre i dati in un database consentendo agli sviluppatori di ottenere un riferimento a un oggetto (ad esempio un nodo di una persona) e trattarlo come qualsiasi altro oggetto senza alcuna conoscenza di dove e come albero è memorizzato internamente?

Sarebbe anche bello se la soluzione cercasse di ottimizzare la quantità di query che sono state fatte. Ad esempio, invece di inserire 10000 nodi persona uno alla volta, in qualche modo capirebbe un modo per inserirli in batch.

Si tratta di una memoria temporanea: una volta completata l'analisi, tutti i dati possono essere scartati mentre serializziamo i dati in un file (di nuovo, in base a pratiche che sono state implementate anni fa. Può essere modificato , ma non abbiamo ancora programmi per questo)

    
posta That Umbrella Guy 06.02.2014 - 22:53
fonte

1 risposta

1

In pratica stai riscontrando un problema che la maggior parte degli ORM tenta di risolvere. Hai definito un modello di oggetto e vuoi mantenerlo in modo non oggettuale. So che NHibernate lo risolve sottoclassi ogni classe nel modello e aggiunge una funzionalità specifica che gli consente di tenere traccia delle modifiche a questa classe. Quindi, quando la sessione si chiude, tali classi vengono interrogate per le modifiche apportate e tali modifiche vengono convertite in aggiornamenti SQL. Questo è chiamato Modello di unità di lavoro .

Potresti fare lo stesso. Definire il modello in una classe di classi e quindi sottoclasse quelle nel modulo "persistenza" e aggiungere la logica di persistenza. Ma questo tipo di logica è solitamente estremamente difficile e noioso da programmare. E richiede la modifica del modello di persistenza ogni volta che cambia il modello stesso.

Come ho detto nel mio commento, sarebbe meglio se tu riuscissi in qualche modo ad analizzare l'intera cosa in un database e lavorarci direttamente lì. Non ha nemmeno bisogno di essere relazionale, potrebbe anche essere una soluzione NoSQL. E molti di questi consentono l'accesso incorporato in memoria, quindi non è necessario preoccuparsi di eseguire un'applicazione separata o problemi di prestazioni. Per me, questa sarebbe la soluzione più ragionevole.

    
risposta data 06.02.2014 - 23:33
fonte

Leggi altre domande sui tag