Il server richiede l'ottimizzazione - dimensione vs frequenza

2

la mia app simile a una mappa carica i dati dall'API di google map ma carica anche alcuni dati aggiuntivi, sotto forma di XML, dal mio server.

Quando l'app viene caricata, ha bisogno solo di una piccola quantità di dati per coprire l'area attualmente visibile, ma c'è una possibilità del 2% (ovvero tasso di conversione) che l'utente interagirà con la mappa e saranno necessari più dati.

Il mio problema è che non riesco a stimare realmente la probabilità che l'utente abbia bisogno di una certa parte dei dati della mappa, quindi non posso stimare la dimensione ottimale del pacchetto di dati. Devo inviare solo il numero minimo di dati di cui l'utente ha bisogno in questo momento o dovrei inviarlo per tutti gli schermi vicini, o anche di più?

In teoria, qual è lo scambio tra l'invio di una grande porzione di dati - molti byte (larghezza di banda lotto) ma poche richieste server - o l'invio di piccole porzioni di dati quando necessario - richieste server piccole ma frequenti?

I blocchi XML verranno memorizzati nella cache, ma i blocchi più grandi che generano maggiori sono le possibilità che dovrò aggiornarlo ogni volta che qualcosa cambia nei dati (che succederà abbastanza frequentemente).

Non riesco ancora a quantificare le dimensioni e le probabilità, quindi per favore tratta questa domanda in modo altamente teorico. Mi piacerebbe sentire le tue opinioni.

    
posta daniel.sedlacek 14.04.2011 - 11:19
fonte

2 risposte

3

Per le prestazioni del server dipende in qualche misura dal collo di bottiglia della CPU o dalla larghezza di banda, ma per mancanza di dati migliori è possibile presumere che l'overhead della richiesta sia equivalente a 10 kB di dati.

Per l'utente è leggermente diverso, chiunque disponga di una connessione a velocità ragionevole vorrebbe soprattutto che la tua applicazione fosse reattiva, per questo motivo la soluzione a pacchetto grande potrebbe essere preferibile.

Un'altra cosa, se le dimensioni contano, un formato di dati XML non è probabilmente la scelta giusta.

Modifica: Personalmente di solito finisco per creare un formato dati quasi-binario personalizzato per tali cose, ma probabilmente ho la tendenza a strafare un po 'la compressione, perché è divertente.

In ogni caso, anche le cose che influiscono maggiormente sulle dimensioni dei dati sono le più semplici. JSON è una buona base, ma il classico stile JSON è piuttosto XML-ish. Il più grande overhead trovato in JSON è di solito tipi di dati a valore-chiave, in questo modo:

data={
    foo:356682,
    bar:"something",
    foobar:true
}

Con la stessa struttura ripetuta per un carico di datapoint, il passaggio da chiavi esplicite a chiavi implicite è il primo passo, invece di quello precedente si usa qualcosa del tipo:

data=[
    356682,
    "something",
    true
]

I dati devono ora essere nello stesso ordine esplicito per rendere possibile l'estrazione di dati inequivocabile, ma il vantaggio in termini di dimensioni è evidente.

Altre opzioni includono l'uso di stringhe delimitate internamente piuttosto che di matrici di stringhe, numeri di codifica di base 64 e in generale creatività riguardo alla scelta del più breve dei modi in cui è possibile rappresentare qualsiasi parte di dati.

data="BXFK|something|1"

Come per lo zippamento, non è magico, specialmente se si utilizza un algoritmo abbastanza veloce da essere eseguito in tempo reale su un server occupato. Lo sviamento normale non ottiene l'immagine più ampia, si noterà che {foo: , ,bar:" e ",foobar: sono schemi comuni e riservano identificatori relativamente brevi per questi, ma non va in giro ripetendo più volte questi identificatori. Inoltre, più rimuove un overhead, migliore sarà l'algoritmo zip che gestirà la ridondanza nei dati effettivi. Non sorprenderti se hai creato qualcosa che sembra abbastanza compatto e un semplice zip, quindi taglia le dimensioni a metà.

    
risposta data 14.04.2011 - 12:54
fonte
1

Il grande kicker è come si connettono i client. I server sono facili da ottenere pipe grasse e reattive e impostano il caching di fantasia / riduzione / precomputing della mappa per risolvere problemi di scala. I clienti sono molto più difficili. Se prendi di mira le aziende con grandi tubi grassi e un sacco di hardware che potrebbe spingere verso qualcosa di più loquace. Se sei preoccupato per i telefoni cellulari del terzo mondo con connessioni di 2.5 g scadenti, dovrai giocare a giochi attenti sul bilanciamento tra chattyness e dimensioni del payload. Ma tieni presente che spesso è più costoso aprire quella connessione HTTP piuttosto che trasferire il carico utile. A causa di questo, mi sbaglierei verso il lato meno chiacchierone - la larghezza di banda, il numero di connessioni no.

    
risposta data 14.04.2011 - 14:18
fonte

Leggi altre domande sui tag