laden von txt dateien dauert ewig

Für allgemeine Fragen zur Programmierung mit PureBasic.
5hplayer
Beiträge: 4
Registriert: 09.11.2008 13:47

laden von txt dateien dauert ewig

Beitrag 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 :)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: laden von txt dateien dauert ewig

Beitrag 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
a²+b²=mc²
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Radiate
Beiträge: 114
Registriert: 10.02.2008 16:40
Kontaktdaten:

Beitrag 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
» PureBasic 4.30
» AMD Athlon II X2 240 | 2048 RAM | Win XP SP 3
» Projekt(e): Fusion (eingestellt), SAS (eingestellt), Moviez
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Radiate
Beiträge: 114
Registriert: 10.02.2008 16:40
Kontaktdaten:

Beitrag von Radiate »

Wollte 5hplayer nen Denkanstoß geben und nicht dir @cxAlex. :lol:

Aber so hat er auch schon den passenden Code dazu. :allright:
» PureBasic 4.30
» AMD Athlon II X2 240 | 2048 RAM | Win XP SP 3
» Projekt(e): Fusion (eingestellt), SAS (eingestellt), Moviez
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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:
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
5hplayer
Beiträge: 4
Registriert: 09.11.2008 13:47

Beitrag von 5hplayer »

hey danke cxAlex, werd dein teil nachher mal ausprobieren. also feuer frei fürs fröhliche testen :)
Antworten