Domanda

Ho bisogno di consigli. Ho un'applicazione che importa 10.000 righe contenenti nome e amp; indirizzo da un file di testo in XElements che vengono successivamente aggiunti a una coda sincronizzata. Quando l'importazione è completa, l'app genera thread di lavoro che elaborano gli XElementi dequefacendoli, effettuando una chiamata al database, inserendo l'output del database nel documento di richiesta e inserendo il documento elaborato in una coda di output. Quando tutte le richieste sono state elaborate, la coda di emissione viene scritta sul disco come documento XML.

Ho usato XElements per le richieste perché avevo bisogno della flessibilità di aggiungere campi alla richiesta durante l'elaborazione. ad esempio, a seconda del tipo di lavoro l'app potrebbe richiedere che aggiunga il numero di telefono, la data di nascita o l'indirizzo e-mail a una richiesta basata su una corrispondenza nome / indirizzo con un database di record pubblico.

Le mie domande sono; Gli XElements sembrano usare un bel po 'di memoria e so che c'è un sacco di analisi mentre il documento si fa strada attraverso i metodi di elaborazione. Sto pensando di sostituire gli XElements con un oggetto Dictionary ma sono scettico che il guadagno varrà la pena. In sostanza realizzerà la stessa cosa.

Pensieri?

È stato utile?

Soluzione

Quindi non stai effettivamente usando alcun XML in quanto tale? Stai solo usando XElement come una raccolta di coppie nome / valore? Se è così, userei sicuramente un dizionario. Mi aspetto che anche il tuo codice risulti potenzialmente più pulito.

D'altra parte, se stai veramente usando XML, probabilmente vuoi rimanere con XElement .

Hai effettivamente un problema ? Dici che sta esaurendo un po 'di memoria - hai memoria sufficiente? Potresti comprare più memoria? Sarebbe quasi sicuramente più economico che spendere anche qualche ora di refactoring, se fosse solo per il gusto di risparmiare memoria. (Sembra che questa app sia eseguita su una sola casella: potrei sbagliarmi. Più è diffusa, più probabilmente ha senso dedicare un po 'di tempo a ottimizzarla.)

EDIT: Okay, quindi acquistare più memoria non è realmente praticabile. Anche così, hai davvero un problema? Qual è l'impatto di questo forse usando più memoria del necessario? Quanto ti costa davvero ?

Altri suggerimenti

L'uso di LINQ può avere senso se puoi evitare di dover memorizzare l'intero albero prima di usarlo.

Vorrei esaminare il più possibile l'elaborazione nella creazione della query da ogni riga.

Quindi prendi i risultati della query e poi li elabori, memorizzando il risultato nel database.

Ciò ridurrà i problemi di memoria, poiché ogni riga viene letta solo quando necessario e quindi elaborata e salvata.

Potrebbe esserti utile: http: // www.onedotnetway.com/tutorial-reading-a-text-file-using-linq/

Prendi i risultati della tua query, esegui un ciclo for attraverso ciascun cliente e salva il record:

var query =
        from c in
            (from line in File.ReadAllLines(filePath)
             let customerRecord = line.Split(',')
             select new Customer()
                 {
                     Firstname = customerRecord[0],
                     Lastname = customerRecord[1],
                     PhoneNumber = customerRecord[2],
                     City = customerRecord[3],
                     Country = customerRecord[4]
                 })
        where c.Country == "UK"
        select c;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top