Question

J'ai besoin de conseils. J'ai une application qui importe 10 000 lignes contenant name & amp; adresse d'un fichier texte dans XElements qui sont ensuite ajoutés à une file d'attente synchronisée. Une fois l'importation terminée, l'application génère des threads de travail qui traitent les XElements en les désen mettant en file d'attente, en effectuant un appel à la base de données, en insérant la sortie de la base de données dans le document de requête et en insérant le document traité dans une file d'attente de sortie. Lorsque toutes les demandes ont été traitées, la file d'attente de sortie est écrite sur le disque en tant que document XML.

J'ai utilisé XElements pour les requêtes car j'avais besoin de la souplesse nécessaire pour ajouter des champs à la requête lors du traitement. i.e. En fonction du type de travail, l'application peut nécessiter l'ajout d'un numéro de téléphone, d'une date de naissance ou d'une adresse électronique à une demande basée sur une correspondance de nom / adresse avec une base de données d'enregistrements publics.

Mes questions sont; Les XElements semblent utiliser assez de mémoire et je sais qu'il y a beaucoup d'analyses au fur et à mesure que le document avance dans les méthodes de traitement. J'envisage de remplacer les XElements par un objet Dictionary mais je suis sceptique, le gain en vaudra la peine. En substance, il accomplira la même chose.

Pensées?

Était-ce utile?

La solution

Donc, vous n’utilisez réellement aucun fichier XML en tant que tel? Vous utilisez simplement XElement en tant que collection de paires nom / valeur? Si oui, j'utiliserais certainement un dictionnaire. Je m'attendrais à ce que votre code soit éventuellement plus propre.

Par contre, si vous utilisez réellement XML, vous voudrez probablement vous en tenir à XElement .

Avez-vous réellement un problème ? Vous dites que cela utilise assez de mémoire - avez-vous assez de mémoire ? Pourriez-vous acheter plus de mémoire? Ce serait presque certainement moins cher que de passer même quelques heures à la refactorisation, si ce n'est que pour économiser de la mémoire. (On dirait que cette application ne fonctionne que sur un seul boîtier. Je peux me tromper. Plus elle est largement déployée, plus il est logique de passer du temps à l'optimiser.)

EDIT: D'accord, acheter plus de mémoire n'est donc pas vraiment viable. Malgré tout, avez-vous réellement un problème? Quel est l'impact de cette utilisation peut-être plus de mémoire que nécessaire? Que vous coûte-t-il vraiment ?

Autres conseils

Utiliser LINQ peut être utile si vous évitez de stocker l’arbre entier avant de l’utiliser.

Je souhaiterais effectuer le plus de traitement possible lors de la création de la requête à partir de chaque ligne.

Vous prenez ensuite les résultats de la requête, puis vous les traitez pour les stocker dans la base de données.

Cela réduira les problèmes de mémoire car chaque ligne n'est lue que si nécessaire, puis traitée et enregistrée.

Cela pourrait vous être utile: http: // www.onedotnetway.com/tutorial-reading-a-text-file-using-linq/

Prenez les résultats de votre requête, faites une boucle for pour chaque client et sauvegardez l'enregistrement:

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top