Domanda

lo scenario

Sto costruendo un'applicazione Web in cui i report possono essere generati al volo (in base alle informazioni recuperate da un database SQL). Questi rapporti conterranno grafici, che possono anche essere generati al volo. Poiché questi grafici contengono informazioni sensibili, utilizzando un'API del grafico a 3 ° partito (cioè: Google Charts) è fuori questione.

il problema

Sto usando l'estensione GD di PHP per generare questi grafici. È piuttosto lento. La cache è la strada da percorrere, ma il problema è che c'è un numero enorme di grafici possibili; Sebbene ritengo che la maggior parte dei grafici richiesti sarà quella che è stata generata prima.

soluzione parziale

I grafici sono generati con dati e altre informazioni (dimensioni, tipo di grafico, ecc.). Poiché questi possono identificare in modo univoco un grafico, conferisco a ogni grafico un hash unico in base a queste informazioni e salvalo. Ora posso calcolare l'hash per un grafico appena richiesto e vedere se lo ho già reso.

Il problema con questo è l'evento di una collisione. Per aggirarlo, sto pensando di salvare l'hash e una forma serializzata dei dati in una tabella SQL. Quindi se ho un colpo di cache, confronterò ancora i dati in sé.

Io sono troppo ingegneristico? (È un hash di 160 bit - SHA1)
C'è un modo migliore per gestire questo?

È stato utile?

Soluzione

.

Sto usando l'estensione GD di PHP per generare questi grafici. È piuttosto lento.

Sospetto che non sia GD che è il bit lento. Il candidato più probabile è l'elaborazione della raccolta dei dati (da un database?). Nel qual caso è possibile ottenere vantaggi significativi dall'ottimizzazione dello schema del database / e / o utilizzando i dati pre-consolidati.

Sebbene tu possa anche considerare la caching dell'output della query, ma a meno che tu non utilizzi gli stessi dati altrove è probabilmente più semplice per memorizzare nella cache delle immagini del grafico.

.

Il problema con questo è l'evento di una collisione.

Ottimizzazione prematura: non succederà. Ma se devi davvero, dividere i meta-dati che stai utilizzando per generare il grafico e archiviarlo in un file separato (di nuovo indicizzato tramite lo stesso hash) - quindi confrontarlo in fase di runtime. Se riesci a ottenere una collisione, avremo un frustino e comprarti un drink.

Consiglierei di dare un'occhiata a JPGraph - che è un po 'eccellente di software e ha la cache integrata.

c.

Altri suggerimenti

Probabilmente se la lunghezza dei dati hashed è inferiore a 160 bit, sei al sicuro.Altrimenti, come tu dica, è possibile verificare le collisioni e il confronto dei dati.

Dai un'occhiata a ChartDirector lo usiamo al lavoro e non si affida aLa libreria GD, dovrebbe essere più veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top