c # applicazione per leggere i file xml, analizzarli, archiviarli localmente nella struttura dati e scrivere in csv

1

Devo sviluppare un'applicazione c # in grado di leggere file xml di grandi dimensioni. I file XML contengono dati sui sistemi informatici (ad esempio informazioni su hardware, software, rete, bios). Ci sarà un file xml separato per ogni categoria, ad esempio file xml hardware, file xml software. Un id del computer è un attributo comune in tutti questi file xml. Potrebbe essere possibile che un ID computer sia presente in un file xml ma non in un altro. Dopo aver eseguito la parte di lettura e aver memorizzato i dati localmente, deve essere scritto in diversi csv i.e Hardware.csv, software.csv. Devono essere scritti solo quegli id che sono presenti in tutti i file xml. Sto pensando all'approccio in basso per farlo,

1) Leggi ogni file xml, memorizza il suo id del computer nella struttura dei dati come Dizionario (con la chiave essendo il suo id del computer e il valore è Arraylist >). Ogni oggetto avrà attributi associati. Ad esempio - Hardware xml verrà letto e memorizzato nel dizionario come < 1, hwarraylist & gt ;. Ogni oggetto hw avrà attributi come hwmodel, hwmanufacturer ecc.

2) Durante la lettura del secondo file xml, il file xml del software, se l'ID esiste già nel dizionario, un swarraylist verrà aggiunto al suo valore. Altrimenti viene aggiunto un nuovo computerid al dizionario.

3) Dopo aver terminato tutte le letture, scriverò un array di solo id che hanno numero di arraylist = numero di file xml. Csv separato per l'arraylist separato.

Questo approccio è corretto? Sarà fattibile per milioni di righe in ogni file xml?

Un'altra cosa da aggiungere, il file xml è conforme al seguente formato:

    <result_sets>
      <result_set>
<cs>
  <c>
    <wh>123</wh>
    <dn>Computer ID</dn>
    <rt>1</rt>
  </c>
  <c>
    <wh>112</wh>
    <dn>Name</dn>
    <rt>1</rt>
  </c>
  <c>
    <wh>124</wh>
    <dn>System</dn>
    <rt>1</rt>
  </c>
</cs>
<rs>
  <r>
    <id>8820</id>
    <cid>230</cid>
    <c>
      <v>230</v>
    </c>
    <c>
      <v>Windows</v>
    </c>
    <c>
      <v>system32</v>
    </c>
  </r>
</rs>

È possibile analizzarli usando XMLReader o dovrei trattare come file di testo e fare l'elaborazione. Si prega di avvisare

    
posta Anky 13.05.2015 - 06:39
fonte

3 risposte

1

milioni di righe: devi comprendere i requisiti di memoria di ogni riga archiviata, se hai 1 milione di righe e ogni riga è 1k (inclusi i sovraccarichi degli oggetti), allora si tratta di un gig di RAM utilizzato. Le stringhe possono diventare grandi, quindi potresti incorrere in problemi di memoria abbastanza facilmente.

Quello che stai cercando di fare qui è un classico problema di unione (dovresti scriverlo in COBOL - il classico programma COBOL è uno che prende un elenco di dipendenti e un altro elenco di lavoro e li unisce per eseguire il libro paga!) che funziona meglio se i file di input sono ordinati.

Se sono stati ordinati in ordine id, è possibile aprire ciascuno e leggere una voce da ciascuno, 1 alla volta, se gli ID corrispondono scrivono una riga sul file di output, quindi ripetere fino a quando tutti gli input sono esauriti. L'utilizzo della memoria è minimo, l'efficienza è ottima (poiché non è necessario memorizzare e ricordare tutti gli ID, verranno in ordine).

Quindi prima lavorerei su un sorter per gli input xml.

    
risposta data 13.05.2015 - 09:58
fonte
0

Is this approach correct ?

Se intendi "corrisponde alla descrizione del problema" - sì, mi sembra.

Se intendi - "hai compreso correttamente i requisiti" - chi lo sa, ma tu.

Se intendi - c'è un approccio migliore - c'è sempre un approccio migliore, ma forse quello che hai scritto è sufficiente per il tuo caso, lo scoprirai probabilmente provandolo.

Ciò che probabilmente non farei è semplicemente aggiungere gli elenchi di categorie a ArrayList . Se non stai molto attento, finirai per non sapere quale delle diverse categorie è in quale indice della tua lista. L'utilizzo di un Dictionary<string,CategoryList> può risolvere questo problema, in cui la chiave è il nome della categoria e il valore è un supertipo dei diversi elenchi di categorie.

Will it be feasible for millions of rows in each xml file ?

Dipende dalla corretta implementazione e dall'hardware / memoria principale disponibili. Se i tuoi file XML sono molto grandi, dovresti evitare di leggerli completamente in XmlDocument , perché è molto costoso. Meglio usare qualcosa come XmlReader , che elabora il file in modo sequenziale. Tuttavia, devi testare da solo se tutti i CategoryList s in memoria funzioneranno nel tuo caso.

    
risposta data 13.05.2015 - 07:47
fonte
-1

Milioni di righe !! Pensa prima alle prestazioni: -)

1) Probabilmente si può pensare di creare un servizio WCF o un servizio Windows per elaborare l'analisi e l'analisi XML. Passi di generazione CSV.

2) Usa il pacchetto SSIS per analizzare l'enorme file XML in dati da archiviare nel database. Ciò ti aiuterà a convertire il grande file XML in record. Quindi è possibile utilizzare per generare il file CSV dal codice .net. Recentemente, ho usato il pacchetto SSIS per elaborare un enorme set di record e ci è voluto molto meno tempo per gestirlo.

Dato che ci saranno milioni di record nel file XML, penso che aggiungerà un sacco di vincoli sulla memoria durante l'analisi dell'XML in forma di oggetto.

    
risposta data 13.05.2015 - 10:05
fonte

Leggi altre domande sui tag