Le migliori pratiche per caricare file di grandi dimensioni, visualizzare in anteprima e modificare prima di salvare nel database?

4

Sto permettendo agli utenti di caricare un file .csv relativamente grande (circa 1 MB): conterrà migliaia di record che rappresentano ciascuno uno dei miei oggetti di business. Voglio che gli utenti caricino il file e poi vengano visualizzati i risultati paginati (dopo che il mio server lo analizza, aggiungi i messaggi di convalida, ecc.). Possono rivedere / modificare i risultati pagina per pagina finché non sono soddisfatti. A questo punto, farebbero clic su un pulsante Salva e tutti i dati verrebbero salvati nel mio database. In alternativa, potrebbero fare clic su un pulsante Annulla: in questo modo verranno rilasciati tutti i dati caricati e nessuno di essi verrebbe a contatto con il mio database.

Preferirei non utilizzare le tabelle di "staging" nel mio database. E con questo intendo memorizzare i dati caricati nel mio db quando viene caricato e successivamente cancellarlo se l'utente sceglie di annullare l'intera operazione. Inoltre, la mia situazione è tale che dovrei eliminarla dalla tabella "staging" anche se l'utente ha scelto di salvare i dati (lavorando con i sistemi legacy).

Il mio ragionamento iniziale per NON utilizzando tabelle di staging è il seguente:  questa funzione potrebbe essere solo un piccolo sottoinsieme delle mie esigenze. Potrei realisticamente avere diverse funzionalità estremamente simili del mio sito che potrebbero richiedere la necessità per le tabelle di "staging". Preferirei non avere il mio database disseminato (per mancanza di una parola migliore) con tali tabelle.

Preferirei anche evitare di salvare il file su disco in quanto tale tipo di soluzione è IMHO non scalabile quanto la memorizzazione del file all'interno del database.

Inoltre, va notato che tutta la convalida e l'analisi dei dati devono (nelle mie circostanze) essere eseguite su server.

La mia domanda è questa: per evitare tabelle di "staging" apparentemente eccessive / non necessarie nel mio database, è una cattiva pratica archiviare TUTTI i dati del file caricato (cioè in una matrice di byte o in una stringa codificata base64) in un proprietà sul mio modello di vista? L'intento è di mantenere questo valore di grandi dimensioni sul mio modello di vista mentre l'utente sfoglia le pagine e le revisiona / modifica.

Anche se penso che questa domanda sia abbastanza indipendente dalla tecnologia, se aiuta, sto usando ASP.Net MVC / Web API e un database MSSQL.

    
posta rwisch45 04.02.2015 - 01:19
fonte

2 risposte

1

Memorizzare i file in memoria non sembra una cattiva idea se ce ne sono solo alcuni. 1Mb di dati non è molto sui server moderni, quindi è tutto a livello di utenti simultanei che hai e cosa succede quando ti "esaurisci" di memoria.

Nella mia esperienza, provo a ridurre la dimensione dell'impronta di memoria di ogni richiesta di servizio web perché il server di solito è un giudice migliore per la memorizzazione nella cache e l'allocazione della memoria tra processi ed è talvolta difficile giudicare o persino verificare come l'applicazione si ridimensiona quando il numero di utenti aumenta e il pool di memoria si riduce rapidamente come risultato. Se segui questa strada, ti consiglio di eseguire un test di carico molto accurato se la memoria è anche leggermente sotto stress.

Inoltre, se si mantiene il file pre-controllato solo in memoria, il debug / controllo del ciclo di caricamento / modifica / salvataggio diventa più difficile perché non si ha alcuna registrazione di come appariva il file prima che fosse rivisto e salvato, quindi se si ha qualsiasi problema con il codice di modifica a lungo termine (o un utente contesta persino quale sia il codice di modifica) non è possibile risalire e osservare l'effetto del codice, anche per un breve periodo di ore o giorni. Nell'elaborazione della memoria è necessario uno sforzo maggiore con la creazione degli strumenti di debug / audit.

In alternativa, due possibili suggerimenti:

  1. Hai considerato di eseguire una seconda istanza di database con tabelle di lavoro temporanee / temporanee solo in quel database? Ciò manterrebbe il vostro database principale 'pulito' e (possibilmente costoso) funzioni di eliminazione e ottimizzazione post-eliminazione anche dal vostro database principale. È anche possibile memorizzare un tempo di "eliminazione" sulla tabella in modo che un lavoro pianificato cancelli le vecchie tabelle in caso di mancata presentazione in termini di un utente che non fa mai clic sul pulsante "Salva". (Verrà richiesto di caricare nuovamente il file se hanno lasciato il divario tra il caricamento e il salvataggio oltre una soglia ragionevole).

  2. Se non ti aspetti troppi utenti simultanei di questa funzionalità, potresti anche considerare l'uso di una cache in memoria (come memcached) per archiviare il file mentre è in corso di revisione ecc. Un memcached da 1 Gb potrebbe archiviare fino a un migliaio di file contemporaneamente, quindi, a meno di non essere sottoposti a un carico molto intenso, questo ti farebbe risparmiare la necessità di richiedere un nuovo caricamento da parte dell'utente perché la cache ha scaricato il tuo file. Si noti che questa soluzione non rende necessaria una buona traccia di controllo, se si sceglie di controllare allora è possibile attivare un semplice script che legge le voci memcached e le scrive su disco per un controllo successivo senza che influisce sul codice live .

risposta data 04.02.2015 - 09:15
fonte
-2

Per semplicità, ti permettono di avere 3 file upload.aspx preview.aspx e store.aspx

Puoi caricare il tuo pulsante di caricamento e tutti gli elementi HTML in upload.aspx e inviare una richiesta di post per preview.aspx con i contenuti caricati. Il file, preview.aspx, analizzerebbe semplicemente il file degli utenti e lo produrrebbe come un valore del modulo HTML e presenterebbe un pulsante di invio / annullamento per il modulo HTML. Quando il modulo viene inviato, invierà tutti i dati a store.aspx che verificherebbe se il pulsante di invio fosse stato cliccato e avrebbe eseguito tutte le attività sul lato server (convalida e tutto) e lo avrebbe archiviato sul tuo db.

    
risposta data 04.02.2015 - 05:07
fonte

Leggi altre domande sui tag