Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

Îåêßíçóå áðü ôï ìÝëïò miket969. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 18-11-2009, 16:51. Υπάρχουν 11 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  18-11-2009, 13:46 55263

    going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    Αυτό το thread δεν είναι τόσο μια αναζήτηση συγκεκριμένης απάντησης σε κώδικα όσο γενικότερων ιδεών. Ιδού το θέμα:
    Έχω ένα XML αρχείο της τάξεως των πολλαπλασίων του 250ΜΒ. Ψάχνω για συγκεκριμένα elements τα δεδομένα των οποίων επεξεργάζομαι. Το να περάσει όλα τα elements στα 250ΜΒ με έναν απλό XmlReader παίρνει πολύ λίγη μνήμη αλλά περίπου 4 ώρες σε χρόνο. Το πρώτο είναι φυσικό αφού δε φορτώνεται όλο το XML στη μνήμη (σαν DOM ας πούμε) και ο χρόνος είναι πάλι λογικός αφού ο XmlReader περνάει όλο το αρχείο σειριακά tag προς tag, attribute προς attribute, inner text προς inner text...
    Η ερώτησή μου είναι: υπάρχει κάποιος τρόπος (βιβλιοθήκη στο .ΝΕΤ, αλγόριθμος κλπ) που να μπορεί να βοηθήσει στη μείωση του χρόνου επεξεργασίας; (Το segmentation του XML δεν είναι εφικτό, για όσους σκέφτηκαν τα threads :P )
  •  18-11-2009, 14:20 55264 σε απάντηση της 55263

    Απ: going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    Επειδή το χρειάστηκα σε μια περίπτωση να διαβάσω ένα αρκετά μεγάλο αρχείο XML έκανα μια παράκαμψη και χρησιμοποίησα τον SQL Server. Ειδικότερα χρησιμοποίησα SQLXML Bulk Load

    Πλεονεκτήματα αυτής της λύσης
    • Πολύ γρήγορο insert στους πίνακες του SQL Server (bulk insert)
    • Πολύ εύκολη αναζήτηση  με απλές SQL Commands (εποχές προ LINQ)
    • Τα join σε σώνουν από άπειρο χρόνο και η αναζήτηση γίνεται πολύ αποδοτική
    Μειονεκτήματα 

    • Ύπαρξη SQL Server
    • o SQLXML Bulk Load είναι COM object άρα θα χρειαστείς και ένα wrapper για να το χρησιμοποιήσεις με το .net
    Δες βασικά αυτό το Παράδειγμα από το MSDN

    Βασικά εξαρτάται από το Background του καθενός. Εγώ επειδή ξεκίνησα ως database developer εκεί βρήκα την λύση. Πιστεύω πάντως ότι είναι η πιο απλή.

    Manos
  •  18-11-2009, 14:33 55266 σε απάντηση της 55263

    Απ: going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    Για πολύ όμορφο XML Querying μπορείς να χρησιμοποιήσεις LINQ to XML.

    Ξεκινώντας με την XDocument.Load("xmlFile");

    Και συνεχίζοντας δημιουργώντας queries ξεκινώντας από το root του αρχείου.
    Μπορείς να πάρεις Attributes, Elements, και να κάνεις ότι θέλεις. Ακόμη έχεις και τις
    extension methods. Και φυσικά όλα τα Linq results είναι αυτόματα και DataSource.

    Example:

    var customersInCountry =
      from cust in customers.Descendants("Customer")
      where cust.Element("Country").Value == myCountryParam
      select new
         {
            CustomerID = cust.Attribute("CustomerID").Value,
            Company = cust.Element("Company").Value,
            Phone = cust.Element("Phone").Value 
         };


  •  18-11-2009, 14:40 55267 σε απάντηση της 55266

    Απ: going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    Τάσκος Γιώργος:
    Για πολύ όμορφο XML Querying μπορείς να χρησιμοποιήσεις LINQ to XML.

    Συμφωνώ και προσυπογράφω ότι η LINQ to XML είναι o πιο elegant τρόπος. Και εγώ αυτόν χρησιμοποιώ πια. 

    Εδώ το θέμα όμως είναι performance και δεν νομίζω ότι αυτός ο τρόπος είναι πιο γρήγορος. Μάλλον για να ακριβολογώ δεν ξέρω αν είναι πιο γρήγορος. 

    Τι γίνεται όταν έχεις ένα αρχείο με trunsuctions 500ΜΒ++.????? 

    Manos
  •  18-11-2009, 14:43 55268 σε απάντηση της 55267

    Απ: going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    Έστειλες ακριβώς όπως έγραφα το ίδιο πράγμα ακριβώς :Ρ. Ιδού:
    "Ευχαριστώ και για τις δύο απαντήσεις, αλλά όσον αφορά αυτή, εκεί που θα κάνεις XDocument.Load(), δε θα φορτώσει όλο το XML στη μνήμη; Και καλά για τα 250ΜΒ αλλά όταν έχω 500,750,1000 κλπ... Αν ισχύει αυτό που λέω δε θα είναι εφικτό να το τρέξουν μικρότερα μηχανήματα"
  •  18-11-2009, 14:48 55269 σε απάντηση της 55266

    Απ: going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    Το LINQ to XML είναι ο τρόπος με τον οποίο κάνεις το query και έχει σχετικά μικρή επίδραση όταν το αρχείο είναι 250 MB. Είτε χρησιμοποιήσεις LINQ to XML και το XDocument, είτε XPath και το XPathDocument, αυτό που έχει σημασία είναι ότι φορτώνεις τα 250MB στη μνήμη πρίν γίνει το query. Το X(Path)Doument θα κάνει parse το XML και θα δημιουργεί ένα δέντρο στο οποίο μπορείς μετά να κάνεις queries χρησιμοποιώντας την αντίστοιχη τεχνολογία.

    Αν το φόρτωμα όλου του αρχείου στη μνήμη δεν είναι πρόβλημα και οι δύο τεχνολογίες μπορούν να δώσουν παραπλήσιες επιδόσεις. Ποιά είναι γρηγορότερη όμως θα βγει μόνο με benchmark.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-11-2009, 14:51 55270 σε απάντηση της 55268

    Απ: going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    [EDITED]

    Απάντησε ο Παναγιώτης που ήξερε το θέμα Loading Large XML στην μνήμη...



  •  18-11-2009, 15:00 55271 σε απάντηση της 55270

    Απ: going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    Είναι λίγο περίεργο να πηγαίνεις να απαντήσεις σε κάτι και να λείπει η ερώτηση! O gtas ρώτησε πως βγαίνουν XML αρχεία εκατοντάδων MB? Πολύ εύκολα. Όταν χρησιμοποιείς XML ως data transfer format, τα αρχεία σου θα βγουν μεγάλα. Είτε μεταφέρεις transactions από ένα σύστημα σε άλλο όπως λέει ο Μάνος, είτε φορτώνεις χαρτογραφικά δεδομένα σε GML, υπάρχουν πάντα περιπτώσεις που ένα data file μπορεί να σου βγει τεράστιο. Η χρήση XML αυξάνει κατά πολύ τον όγκο των αρχείων αλλά αυτό είναι το τίμημα που πληρώνεις.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-11-2009, 15:03 55272 σε απάντηση της 55270

    Απ: going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    Ακριβώς έτσι είναι. Αλλά από ότι βλέπω δεν υπάρχει κάτι πέρα από το να φορτώσω όλο το XML μνήμη. Πρέπει να θυσιάσω χρόνο ή μνήμη (όπως πάντα άλλωστε :Ρ)
  •  18-11-2009, 15:10 55273 σε απάντηση της 55271

    Απ: going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    Ευχαριστώ για την απάντηση Παναγιώτη αν και την έκανα EDIT την ερώτηση για να μην αλλάξω focus.
    Ξέρω πως πολλές τεχνολογίες ανταλλάσουν πληροφορίες σε XML Format.
    Πάντως και πάλι μου φαίνονται πολλά, 1GB ας πούμε XML Surprise, όπως κι αν έχει, λύση υπάρχει, αλα .NET Style Big Smile

    @miket969:

    Θυσίασε λίγο μνήμη, είναι και φθηνή άλλωστε τελευταία :P

  •  18-11-2009, 15:28 55274 σε απάντηση της 55273

    Απ: going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    Σας ευχαριστώ όλους για τις απαντήσεις  :)
  •  18-11-2009, 16:51 55275 σε απάντηση της 55272

    Απ: going through an XML file... Ποιος είναι ο πιο γρήγορος τρόπος;

    Αν το loading συμβαίνει συχνά η καλύτερη λύση είναι αυτή του Μάνου. Να φορτώσεις το XML σε μία βάση και μετά να κάνεις queries στη βάση. Διαφορετικά μία φορά στο τόσο τα φορτώνεις όλα στη μνήμη και κάνεις τα query σου.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems