Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#10

Re: Der schnellste weg Dateien zu parsen?

  Alt 15. Sep 2006, 14:50
Zitat:
also no way das jetzt noch zu beschleunigen ?
Hm, ich habe dir doch oben par Tipps gegeben auf was du achten solltest damit es eben schneller wird.

1.) Puffergröße auf ca. 8Kb, nicht zu klein wie 1Kb und auf keinen Fall größer als 16Kb. Das hat aber was mit dem Caching, der durschnittlichen Dateigröße die man laden möchte und dem Betriebsystem zu tuen. Besnders letzters ist wichtig da es eben von System zu System unterschiedliche Cachegröße/Methoden gibt und 8Kb ist ein Erfahrungswert der im allgemeinen auf allen OS Versionen gute Ergebnisse bringt. Frage mich nicht woher ich das weis ich weis es einfach weil ich schon oft solche Laderoutinen benötgt habe. Ist also ein Erfahrungs-Bauch-Gefühl-Wert

2.) alle Aufrufe die den Dateizeiger verändern, ausser natürlich .Read(), vermeiden. Das kostet die meiste Zeit und kann die Peformance drastisch reduzieren.

3.) deinen Source deines Parsers hast du noch nicht gezeigt, da steckt wohl das meiste Potential drinnen. Versuche mal einfach meine 1. Loop OHNE Parser laufen zu lassen und teste die Geschwindigkeit. Es dürfte beim 1. Aufruf der gleichen Datei wesentöich länger dauern als beim 2. usw Aufruf.

4.) Natürlich gehts nch schneller !! Viel viel schneller !! Kaufe dir eine PCI Karte die zb. 2 bis 4 FPGA Bausteine drauf hat. Dies steckste in deinen Rechner. Programmierst diese Hardware per VHDL damit sie per UltraDMA Mode 6 oder SATA direkt neben der CPU auf deine Festplatte zugreifen kann. Klar das deine FPGA Bausteine auch die FAT/NTFS lesen könen müssen.
Das diese FPGA echte programmierbare Hadrware ist und mit bis zu 500Mhz getaktet werden können und zudem noch mit weit mehr als 128 Bit Datenbreite arbeiten können und eine SATA Festplatte bis zu 10GByte an Daten pro Sekunde schaufeln kann, heist dies das du damit theoretisch deine 20Mb Datei in wenigen Millisekunden gepasrst hast. Naja an dann läuft das ding ja auch noch parallel zur CPU !

Also schneller gehts garantiert aber ob du dazu in der Lage bist sowas zu bauen sei angezweifelt.

@Unwissender: Die Abbruchbedingung ist schon korrekt so. 1 Loop vor dem Abruch wird .Read () mit 1/SizeOf(Buffer) Wahrscheinlichkeit exakt SizeOf(Buffer) Bytes lesen, aber meistens eben weniger. Der Parser wertet nun immer nur BytesRead Bytes in diesem Buffer aus. In der Letzten Loop haben wir alle Daten gelesen und .Read() wird demzufolge 0 zurück geben müssen.
Man hätte auch im until eine Abbruchbedingung wie ByteRead < SoizeOf(Bufer) benutzen können, das könnte aber Nachteile haben. Denn wenn wir die Datei readonly und shared geöffnet haben und ein zweiter Prozess kontinuierich Daten anhängt dann ist es wahrscheinlich das .Read() mehrmals weniger Bytes ausliest aber denoch beim nchsten Read eben wieder neue Daten vorfinden wird.

Ergo: logisch gesehen solle die Loop exakt so aussehen wie ich es oben gezeigt habe.

Da fällt mir noch eine weitere Methode zur Beschleunigung ein. Öffne die Datei ReadOnly und Exklusiv, dann werden gute OS'e diese Datei schneller nachladen können.

Gruß Hagen
  Mit Zitat antworten Zitat