2010-07-21 20 views
5

Ci scusiamo per il titolo un po 'confuso. Non sono sicuro di come intitolare questo. La mia situazione è questa: ho uno strumento di simulazione accademica, che sto sviluppando per il web front-end. Mentre il simulatore basato su C++ è abbastanza efficiente dal punto di vista computazionale (da diversi centesimi a un decimo di secondo) per piccoli sistemi, può generare una quantità di dati significativa (in termini di applicazioni Web) (~ 4-6mb).Come gestire set di dati di grandi dimensioni per la simulazione lato server -> browser client

Attualmente il setup è i seguenti-

  1. utente accede a file index.html. Questa pagina sul lato sinistro ha una forma interattiva in cui l'utente può inserire i parametri di simulazione. Sul lato destro c'è una rappresentazione del sistema che stanno creando, insieme ad alcune schede in grigio per vari grafici dei dati di simulazione.
  2. L'utente fa clic su "Esegui simulazione". Questo inoltra i parametri sim richiesti a un file runSimulation.php tramite una chiamata AJAX. runSimulation.php crea un file di input in base ai dati inviati, quindi esegue il simulatore utilizzando questo file di input. Il simulatore invia 4-6 MB di dati in vari file di output.
  3. Una volta terminata la simulazione, la risposta al browser è un'altra funzione javascript che chiama un file returnData.php. Questo script php contiene i dati nei file di output come dati JSON, restituisce i dati JSON al browser, quindi elimina i file di dati.
  4. Questi dati di risposta vengono quindi inviati a pochi oggetti di tracciamento nel javascript del browser e le schede di stampa diventano attive. L'utente può quindi aprire e interagire con i dati tracciati.

Questa messa a punto sta funzionando bene, però io sono in esecuzione in due aspetti:

  • Il ritorno dei dati è lenta 4-6MB di dati provenienti schiena può prendere un po 'a carico. (I dati vengono compressi con gzip, il che riduce considerevolmente il suo lato, ma può richiedere ancora 20+ secondi su una connessione più lenta)
  • Il prossimo obiettivo è consentire all'utente di tracciare più esecuzioni di simulazione in modo che possano confrontare i risultati.

Il mio pensiero è che potrei voler conservare i file di dati sul server, mentre la sessione degli utenti è attiva. Ciò consentirebbe la capacità di caricare solo i dati per il tracciato che l'utente desidera visualizzare (e magari caricando altri dati in background mentre visualizzano i risultati del grafico corrente). Per le esecuzioni multiple, posso avere più set di dati seduti sul server, pronti per l'utente da scaricare se/quando sono necessari.

Tuttavia, ho un grosso problema con questa linea di pensiero: come faccio a riconoscere (in php) che l'utente ha lasciato il server ed eliminare i dati? Non voglio che gli utenti prendano il controllo dello spazio su disco sulla macchina. Qualche idea sulle migliori pratiche per questo tipo di app web?

risposta

1

Per il problema n. 1, non ci sono opzioni. Stai già eseguendo il Gziping dei dati e utilizzando JSON, che è un formato relativamente leggero. 4 ~ 6 MB di dati sono davvero tanti. Se pensate che PHP impieghi troppo tempo per generare i dati, potete usare il vostro programma C++ per generare i dati e servirli usando PHP. È possibile utilizzare exec() per farlo.

Tuttavia, io non sono sicuro di come funzionano le simulazioni, ma JavaScript è un linguaggio Turing-completo, quindi si potrebbe generare una certa/più/tutti questi dati sul lato client (qualunque cosa ha più senso). In questo caso, risparmierai molta larghezza di banda e ridurrai significativamente i tempi di caricamento, ma ricorda che JS può essere molto lento.

Per il problema n. 2, se si lasciano i dati sul server, è necessario tenere traccia delle sessioni attive (ovvero: quando è stata l'ultima volta che l'utente ha interagito con il server) e impostare un timeout che abbia senso per la tua applicazione. Dopo il timeout, è possibile eliminare i dati.

Per tenere traccia dell'interazione, è possibile utilizzare JS per verificare se un utente è attivo (inviando heartbeats o qualcosa del genere).

Problemi correlati