Seite 1 von 1

laden von txt dateien dauert ewig

Verfasst: 09.11.2008 14:08
von 5hplayer
hi leute,

wie der titel schon sagt hab ich ein problem beim laden von txt dateien.

Code: Alles auswählen

For i=0 To a-1
  If kontakt$(i)="_srvlog.txt"
  Else
    If ReadFile(0,qip$+konto$+"\History\"+kontakt$(i))=0
      MessageRequester("Fehler","Kann History nicht öffnen")
      End
    EndIf 
    Repeat
      string$=ReadString(0)
    Until string$=eingehend$ Or Eof(0)<>0
    string$=ReadString(0)
    position=FindString(string$," ",1)
    kontakt$(i)=Left(string$,position-1)
    AddGadgetItem(3,-1,kontakt$(i))
    CloseFile(0)
  EndIf
Next 
es sollen die history dateien von qip geöffnet, nach dem nickname des chatpartners gesucht und diesen dann einem comboboxgadget hinzugefügt werden.

a=anzahl der logdateien
qip$=qip verzeichnis
konto$=ordern des eigenen qip accounts
kontakt$=history datei des jeweiligen kontakts
eingehend$="--------------------------------------<-" in der zeile nach dem "--------------------------------------<-" steht immer der nickname des chatpartners


jetzt ist es aber so dass ich ~140 text dateien hab mit größen zwischen 1kb und 5mb. wenn ich das programm das 1. mal nach einem neustart des pc's starte, braucht es 2-3 minuten bis die ganzen namen in die combobox eingetragen werden. schließe ich das programm und starte es neu, werden die dateien ratz fatz geladen. gibt es einen weg das zu beschleunigen? liegt ja vllt einfach nur ein meiner uneleganten weise das zu programmieren :)

Re: laden von txt dateien dauert ewig

Verfasst: 09.11.2008 14:15
von Kiffi
5hplayer hat geschrieben:liegt ja vllt einfach nur ein meiner uneleganten weise das zu programmieren :)
bei zweiten Programmstart werden die Inhalte aus einem Cache gelesen,
der die Daten schneller hergibt als Deine Platte.

Ich sehe auf Anhieb keine Optimierungsmöglichkeiten, der die Ladezeiten
generell auf einen Sekundenbereich drücken könnte.

Allerdings kannst Du die relevanten Daten der bereits gelesenen Dateien in
eine temporäre Hilfsdatei schreiben (dir also einen eigenen Cache anlegen).
Dann bräuchtest Du nicht immer wieder die Dateien durchsuchen, sondern
nur noch Deinen eigenen Cache.

Grüße ... Kiffi

Verfasst: 09.11.2008 14:19
von cxAlex
Würde ich auch so machen. Beim ersten mal liest du alles ein und Speicherst die Namen in einem Cache. Ausserdem speicherst du Prüfsummen der geladenen Dateien. Beim nächsten Programmstart kannst du so erst mal den Chache laden, dann die Prüfsummen vergleichen und musst nur geänderte Dateien neu laden.

Eventuell kannst du ja z.B. beim ersten mal immer 1-5 Datein parallel mithilfe von Threads laden. Würde auf MultiCore Systemen sicher schneller sein. Aber da must du aufpassen das sich die Threads nicht in die Quere kommen, ev. mit Mutex syncronisieren.

Verfasst: 09.11.2008 14:24
von Radiate
Hey das ist jetzt bloß n Gedanke mit dem du evtl etwas anfangen könntest. ;)

Ich weiß das Daten aus dem Arbeitsspeicher schneller verarbeitet werden wie von einer Festplatte.
Versuch doch mal die Daten in den Speicher zu laden und von da aus zu verarbeiten.

Ich denke es war *MemoryID = AllocateMemory(5000) und sollte das zu wenig sein für 5MB und mehr dann benutzt du eben wenn dein Bereich voll ist, diesen Befehl als ELSE Möglichkeit *NewMemoryID = ReAllocateMemory(*MemoryID, 2000).

Ich weiß nicht genau aber ein Arbeitsspeicher wird definitiv mindestens 10x schneller als deine Platte sein.


Gruß Radiate

Verfasst: 09.11.2008 14:34
von cxAlex
Zum lesen einer Datei Zeile für Zeile direckt aus dem Speicher hät ich hier nen kleinen Code:

Code: Alles auswählen

Procedure ReadFileMem(InFile.s)
  ; Datei in Speicher lesen
  FileID = ReadFile(#PB_Any, inFile)
  If FileID
    MemFileSize = Lof(FileID)
    If Not MemFileSize
      CloseFile(FileID)
      ProcedureReturn #False
    EndIf
    *FileBuffer = AllocateMemory(MemFileSize)
    ReadData(FileID, *FileBuffer, MemFileSize)
    CloseFile(FileID)
    MemFileOffset = -1
  Else
    ProcedureReturn #False
  EndIf
  While MemFileOffset<MemFileSize
    ;{ Zeile aus Speicher lesen => cLine
    Start = *FileBuffer + MemFileOffset
    Length = 0
    Repeat
      Length + 1
      Byte.b = PeekB(Start + Length)
    Until Byte = 13 Or Byte = 10 Or MemFileOffset + Length> = MemFileSize
    Skip = 1
    Byte = PeekB(Start + Length + 1)
    If Byte = 10 Or Byte = 13
      Length + 1
      Skip + 1
    EndIf
    MemFileOffset + Length
    cLine.s = PeekS(Start + 1, Length-Skip)
    ;}
    Debug cLine
  Wend
  ProcedureReturn #True
EndProcedure

Verfasst: 09.11.2008 14:46
von Radiate
Wollte 5hplayer nen Denkanstoß geben und nicht dir @cxAlex. :lol:

Aber so hat er auch schon den passenden Code dazu. :allright:

Verfasst: 09.11.2008 14:48
von cxAlex
Wer sagt den was von denken? Hab gewust das ich noch sowas irgentwo auf der Platte habe. Hab meinen Rechenskalven n bisschen suchen lassen, n bisschen Copy&Paste und fertig. :mrgreen:

Verfasst: 09.11.2008 15:56
von 5hplayer
hey danke cxAlex, werd dein teil nachher mal ausprobieren. also feuer frei fürs fröhliche testen :)