Map Parser voor .GDF file optimaliseren (C#)

Status
Niet open voor verdere reacties.

Yamotos

Nieuwe gebruiker
Lid geworden
19 mei 2011
Berichten
2
Hallo mensen,

Voor school zijn wij bezig met het maken van een routeplanner. Daarbij hebben we een parser voor de .GDF file. (Graphical Data File) Gezien de grote van het bestand (> 200Mb) duurt het nu een halve minuut om deze helemaal uit te lezen en de data aan onze dataklassen door te geven.

Op het moment gaat het uitlezen als volgt:
* We gebruiken een streamreader, deze leest alles lijn bij lijn.
* Wanneer hij een lijn heeft kijkt hij naar de eerste 2 integers die op deze lijn staan
* Vervolgens pakt hij de methode die nodig is om deze lijn uit te lezen (hierbij maken we gebruik van de "Case" manier.
* Vervolgens zetten we de hele lijn in een array, doordat de lijnen ook naar een volgende lijn door kunnen gaan.
* Deze lijn zal worden meegegeven aan de eerder genoemde methode om de gegevens te bewerken
* Om de juiste elementen uit de lijst te halen gebruiken we dit:
att_type = list[0].Substring(0, 2);
att_val = list[0].Substring(2, 10);
lan_code = list[0].Substring(12, 3);


Vooral het laatste kan volgens mij veel sneller. Hebben jullie enig idee hoe we dit nog sneller kunnen maken? Het kan heel eenvoudig zijn, maar wij zien hem even niet. Graag wil ik het nog wel zelf doen, dus tips en speudo code is voldoende. Geen hele uitwerkingen dus! :)

Alvast bedankt voor de tips!

Groetjes,
Pascal
 
Zou je misschien wat (meer) van de code kunnen plaatsen? Lijkt me leuk om er even naar te kijken, als het mag :)
(Om het 'op te snellen', natuurlijk)
 
Laatst bewerkt:
je kan het verwerken van de lijn in een aparte treads stoppen, dus hij leest de lijn in, maakt een nieuwe tread aan voor het verwerken van de lijn. en dat een max aantal treads waardoor je bv 10 lijnen tegelijkertijd kan verwerken ipv 1.
 
@cx1213: Thx, nooit aan gedacht, is wel leuk om daarmee even te experimenteren. Dankjewel! :D

@CaptainBri: Hierbij delen van mijn code:
Code:
public static void ParseFile()
        {
            sr = File.OpenText(filename);
            long totalbytes = 0;
            try
            {
                sr = File.OpenText(filename);
                totalbytes = sr.BaseStream.Length;
            }
            catch (Exception e)
            {
                LogException.Log("ParseFile", e);
                MessageBox.Show("No GDF file found.");
                Environment.Exit(0);
            }

            int i = 0;
            while (!sr.EndOfStream)
            {
                String str = sr.ReadLine();
                if (i == 200)
                {
                    percentage = (((double)sr.BaseStream.Position / totalbytes) * 97);
                    i = 0;
                }
                i++;
                String id = str.Substring(0, 2);

                switch(id)
                {
                    case ("03"):
                        ParseEdge(GetLineArray(str));
                        break;
                    case ("05"):
                        ParseAttributeDefinition(GetLineArray(str));
                        break;
                }
            }
***Nog meer code wat verder niet van toepassing is over dit***
       }
Code:
private static void ParseEdge(List<String> lines)
        {
            int edgeId, xyId, nodeFromId, nodeToId, faceLeftId, faceRightId, edgeStatus;

            edgeId = int.Parse(lines[0].Substring(0, 10));
            string str = lines[0].Substring(10, 10);
            if (!str.Trim().Equals(String.Empty))
            {
                xyId = int.Parse(str);
            }
            else
            {
                xyId = -1;
            }
            nodeFromId = int.Parse(lines[0].Substring(20, 10));
            nodeToId = int.Parse(lines[0].Substring(30, 10));
            int.TryParse(lines[0].Substring(40, 10), out faceLeftId);
            int.TryParse(lines[0].Substring(50, 10), out faceRightId);
            int.TryParse(lines[0].Substring(60, 2), out edgeStatus);

            EdgeRecord edge = new EdgeRecord()
            {
                Id = edgeId,
                SectionId = sectionID,
                XyzId = xyId,
                FNodeId = nodeFromId,
                TNodeId = nodeToId,
                LFaceId = faceLeftId,
                RFaceId = faceRightId,
                Status = edgeStatus,
            };

            ParsedData.Edges.Add(edge.SectionId + edge.Id.ToString(), edge);
        }
 
Sorry, dit gaat boven m'n pet :eek:, succes verder! En threads is inderdaad een goed idee :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan