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)