2010-02-28 27 views
10

Ho bisogno di analizzare decine di migliaia di righe di dati. I dati vengono importati da un file di testo. Ogni riga di dati ha otto variabili. Attualmente, utilizzo una classe per definire la struttura dei dati. Mentre leggo il file di testo, memorizzo ogni oggetto riga in un elenco generico, Elenco.Modo efficiente per analizzare grandi quantità di dati?

Mi chiedo se dovrei passare all'utilizzo di un database relazionale (SQL) poiché avrò bisogno di analizzare i dati in ogni riga di testo, cercando di metterlo in relazione con i termini di definizione che attualmente memorizzo anche in elenchi generici (Elenco).

L'obiettivo è tradurre una grande quantità di dati utilizzando le definizioni. Voglio che i dati definiti siano filtrabili, ricercabili, ecc. Usare un database ha più senso più ci penso, ma vorrei confermarlo con sviluppatori più esperti prima di apportare le modifiche, ancora una volta (stavo usando le strutture e arraylists in un primo momento).

L'unico inconveniente che posso pensare è che i dati non devono essere conservati dopo che sono stati tradotti e visualizzati dall'utente. Non è necessario per l'archiviazione permanente dei dati, quindi l'utilizzo di un database potrebbe essere un po 'eccessivo.

risposta

3

Non è assolutamente necessario andare in un database. Dipende dalle dimensioni effettive dei dati e dal processo che devi eseguire. Se stai caricando i dati in un elenco con una classe personalizzata, perché non utilizzare Linq per eseguire query e filtri? Qualcosa di simile:

var query = from foo in List<Foo> 
      where foo.Prop = criteriaVar 
      select foo; 

La vera questione è se i dati sono così grande che non può essere caricato in memoria fino comodamente. Se questo è il caso, allora sì, un database sarebbe molto più semplice.

+0

I file che sto importando tendono a contenere decine di migliaia di linee, alcuni possono estendersi su 100 mila linee. Ogni riga ha otto campi che devono essere analizzati e tradotti. Ad esempio, un campo potrebbe contenere il valore 'phy' e deve essere tradotto in 'Physical Layer' in base a un file di definizione. Sto cercando di capire il modo più efficiente per analizzare e tradurre questi dati. – Snooze

+0

Hai intenzione di fare analisi aggregate sui dati o è elaborato solo linea per linea? Se la versione successiva, la lettura del file di testo e l'elaborazione man mano che si va, potrebbero essere abbastanza veloci rispetto al tentativo di ottenere i dati in SQL Express o Access. Tuttavia, metterlo in un database ti darà un certo grado di flessibilità, come la possibilità di creare indici che dovresti codificare tu stesso. – Thomas

+0

Penso di non avere altra scelta che fare analisi aggregate perché alcune definizioni dipendono dalle righe precedenti nei file di testo. Inoltre, con analisi aggregate posso ristrutturare i dati per renderli più leggibili/più facili da comprendere. Anche se dovessi elaborare al volo, avrei comunque bisogno di una struttura dati in modo che l'utente possa filtrare/cercare i dati. – Snooze

1

Sembra che quello che vuoi sia un database. Sqlite supports database in memoria (utilizzare ": memoria:" come nome file). Sospetto che anche altri possano avere una modalità in memoria.

+0

Questa sembra una soluzione piuttosto interessante. Non ho molta familiarità con i database in memoria, quindi dovrò fare la mia ricerca, ma Sqlite suona come un sistema leggero (a giudicare dal nome). – Snooze

+1

SQLite, nonostante l'hype, non gestisce i dati così bene in milioni. Decine di migliaia, non saprei, dipende. Assicurati di indicizzarlo correttamente. Prova una pagina di grandi dimensioni. Se in qualche modo sospetti che potrebbe crescere a più dati, non impegnarsi in SQLite! Lo so per esperienza – MPelletier

+0

Sì, è lite e ottieni quello per cui paghi. L'ho usato per piccole cose e alcune cose nelle centinaia di migliaia. Inoltre, non è veramente sicuro per i thread. –

0

Se non ti dispiace utilizzando l'accesso, ecco cosa si può fare

Collegare un Access vuoto db come risorsa Quando necessario, scrivere il db fuori di file. Eseguire un'istruzione CREATE TABLE che gestisce le colonne dei dati Importare i dati nella nuova tabella Utilizzare sql per eseguire i calcoli OnClose, eliminare tale accesso db.

È possibile utilizzare un programma come Resourcer per caricare il db in un file RESX

ResourceManager res = new ResourceManager("MyProject.blank_db", this.GetType().Assembly); 
    byte[] b = (byte[])res.GetObject("access.blank"); 

Quindi utilizzare il seguente codice di tirare la risorsa del progetto. Prendere l'array di byte e salvarlo nella posizione temporanea con il nome del file temporaneo

"MyProject.blank_db" è la posizione e il nome del file di risorse "access.blank" è la scheda dato alla risorsa per salvare

+0

BTW, la stessa cosa funziona con SQL Server Compact Edition, che viene fornito con Visual Studio 2008. –

+0

Penso che preferirei usare una soluzione SQL in-memory, ma dovrò fare la mia ricerca. – Snooze

1

Stavo affrontando lo stesso problema che hai dovuto affrontare mentre stavo lavorando alla mia precedente azienda. Il fatto è che stavo cercando una soluzione concreta e buona per un sacco di file generati dal codice a barre. Il codice a barre genera un file di testo con migliaia di record con in un singolo file. Gestire e presentare i dati è stato molto difficile per me in un primo momento. Sulla base dei record di ciò che ho programmato, creo una classe che legge il file e carica i dati nella tabella dati e in grado per salvarlo nel database. Il database che ho usato era SQL Server 2005. Poi ho potuto gestire facilmente i dati salvati e presentarli come mi piace. Il punto principale è leggere i dati dal file e salvarli nel database.Se lo fai avrai molte opzioni da manipolare e presentare come ti piace.

3

Questa non è una grande quantità di dati. Non vedo alcun motivo per coinvolgere un database nella tua analisi.

C'è un linguaggio di query incorporato in C# - LINQ. Il poster originale utilizza attualmente un elenco di oggetti, quindi non c'è davvero nulla da fare. Mi sembra che un database in questa situazione aggiungerebbe molto più calore che luce.

+0

Per il linguaggio di query, in modo da non dover codificare tali cose (o inventarle tu stesso)? –

+1

@jeffamaphone - Esiste un linguaggio di query incorporato in C# - LINQ. Il poster originale utilizza attualmente un elenco di oggetti, quindi non c'è davvero nulla da fare. Mi sembra che un database in questa situazione aggiungerebbe molto più calore che luce. –

+1

Buon punto. Dovresti metterlo nella tua risposta. –

0

Se l'unica cosa che devi fare è cercare e sostituire, puoi prendere in considerazione l'utilizzo di sed e awk e puoi effettuare ricerche usando grep. Ovviamente su una piattaforma Unix.

+0

Su Windows, msys e cygwin possono darti sed e awk. – ecounysis

0

Dalla tua descrizione, penso che gli strumenti di riga di comando di Linux possano gestire i tuoi dati molto bene. L'utilizzo di un database può complicare inutilmente il tuo lavoro. Se si utilizza Windows, questi strumenti sono disponibili anche in diversi modi. Consiglierei cygwin. I seguenti strumenti possono riguardare il tuo compito: ordinare, grep, cut, awk, sed, join, paste.

Questi strumenti di riga di comando di unix/linux possono sembrare spaventosi per una persona di Windows ma ci sono motivi per le persone che li amano. I seguenti sono i miei motivi per amarli:

  1. Permettono di accumulare le tue capacità: le tue conoscenze su uno strumento parziale possono essere utili in diversi compiti futuri.
  2. Consentono ai tuoi sforzi di accumulare: la riga di comando (o gli script) che hai utilizzato per completare l'attività può essere ripetuta tutte le volte necessarie con dati diversi, senza interazione umana.
  3. Di solito superano lo stesso strumento che è possibile scrivere. Se non ci credi, prova a battere l'ordinamento con la tua versione per i file terabyte.
Problemi correlati