Ricerca dei vantaggi di entrambi i file SQL e binari in uno schema di archiviazione dei dati

6

Sto cercando alcuni suggerimenti su come mantenere certi vantaggi sia di un file binario che di un database SQL in un interessante problema di archiviazione dei dati.

Ho un formato di file binario personalizzato legacy che è essenzialmente diverse centinaia di matrici multidimensionali che sono serializzate su un file con fwrite () in C. Ogni file ha una dimensione fissa (~ 5MB non compressi) e rappresenta, per motivi di discussione, un "sistema modellato". Ogni sistema modellato ha il proprio file. Quindi il sistema legacy è solo un mucchio di 5 MB di file.

Abbiamo bisogno di accedere a questi dati in due modi molto diversi (binario e SQL).

Uno scenario di utilizzo si presenta come un'applicazione aziendale tradizionale con un back-end SQL, in cui gli utenti necessiterebbero di determinati valori recuperati e visualizzati (e alcuni aggiornati) come parte di un'app Web. Osservando la struttura tabulare dei dati, ha un evidente percorso verso la conversione in un database SQL standard.

Tuttavia, ci sono anche momenti in cui è necessario caricare praticamente un intero "sistema modellato" da 5 MB in memoria ed eseguire alcuni complessi calcoli iterativi che utilizzano la maggior parte dei valori e aggiornano determinati altri valori nel sistema modellato. Non possiamo colpire il database all'interno dei loop per i calcoli: è troppo lento. Qui la necessità va contro SQL - il veloce fread () da un file binario è perfetto. Mette tutti i dati negli array, pronti per i calcoli complessi, e il risultato è facilmente serializzato su file con fwrite ().

Alcuni punti più rilevanti: in primo luogo, eseguiamo questi calcoli solo 10 volte su un sistema modellato. Quel sistema è effettivamente di sola lettura da quel momento in poi, ed è infine cancellato. I "sistemi modellati" non interagiscono tra loro e un utente lavora solo su uno alla volta. Quindi la nostra struttura dei dati è molto segregata su una base per- "sistema modellato", in effetti un database di database strutturati in modo identico. Inoltre non abbiamo bisogno di enormi dimensioni. Sotto 30 sistemi modellati è tutto ciò che sarebbe attivo contemporaneamente.

Il modo migliore per archiviare tali dati nel back-end di un'app Web?

Alcune idee:

  • Tutto SQL e nessun file binario. Ciò richiede che l'algoritmo di calcolo sia riscritto per funzionare sul gigantesco "oggetto-dio" dal database SQL, piuttosto che su tutti gli array esistenti.

  • Conserva i file binari e, dopo ogni ciclo di calcoli, esporta i dati pertinenti (~ 35%) in SQL per un accesso immediato quando gli utenti devono consultarli tramite un'app Web. Il problema è mantenere i file binari sincronizzati con le tabelle SQL, specialmente quando un utente modifica determinati valori SQL tramite l'app Web, rendendo il file binario obsoleto.

  • Mantieni i dati serializzati in formato binario e (in qualche modo) recupera i dati da quel negozio binario ma codifica che il provider per l'app web sembra brutto.

Ci deve essere un modo migliore.

Grazie!

Modifica: Abbiamo utilizzato il percorso C # / SQL / EntityFramework per un piccolo sottogruppo di dati e il recupero dei dati dal database è stato sorprendentemente lento. (Molti secondi solo per il piccolo sottoinsieme). Ricorda che abbiamo centinaia di array multidimensionali che attraversano il modello OO naturale ma molto profondo che un'app Web vorrebbe. Avendo popolato il modello OO, ci lascerebbe dover ricodificare la porzione di calcolo.

Le risposte e i commenti finora hanno aiutato a esporre la necessità di considerare separatamente il modello in-code dalla memoria stessa. A turno il problema è ora come rendere quel trasferimento (a) veloce, (b) intelligente sull'aggiornamento dei valori e (c) un ragionevole compito da codificare. Sembra che tutti vedano l'archiviazione relazionale (SQL) come la strada da percorrere.

Quindi, come posso ottenere dati dentro e fuori da SQL veloce (er)? La maggior parte delle centinaia di matrici sono 3-5 dimensioni (di ~ 10 dimensioni nello spazio del problema) che equivalgono a chiavi esterne. Questo mi imposterà con una tabella SQL per ogni combinazione univoca di quelle chiavi, oltre a tanti campi per i valori necessari. Non sono bloccato nello stack MS.

Cercherò di non avere alcun ulteriore effetto di creep. Grazie!

    
posta Ian W 03.06.2016 - 06:42
fonte

2 risposte

4

Inserisci i dati in un database.

Scrivi una funzione che estrae tutti i dati dal database e popola gli array.

Passa gli array popolati alla funzione di calcolo invariato

Scrivi una funzione per scrivere un database utilizzando gli array risultanti dalla funzione calc.

    
risposta data 03.06.2016 - 09:29
fonte
1

5 Mb sembra una quantità insignificante di dati in questi giorni. Quindi non mi preoccuperei di tirarlo fuori a richiesta, deserializzarlo e manipolarlo. Le prestazioni non dovrebbero essere un problema date le tue quantità di dati

Se non ci sono modifiche di formato previste per questi dati, mi attenersi a questo approccio.

    
risposta data 03.06.2016 - 11:25
fonte

Leggi altre domande sui tag