Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Indizierung von Dateien (https://www.delphipraxis.net/155531-indizierung-von-dateien.html)

Namenloser 27. Okt 2010 20:04

AW: Indizierung von Dateien
 
Zitat:

Zitat von Mithrandir (Beitrag 1058219)
*g*

Jetzt fehlt nur noch der Teil, in welchem du nach dem string suchst. :)

Schau mal in #7 ;)

Mithrandir 27. Okt 2010 20:10

AW: Indizierung von Dateien
 
gnaaaaaaah.... :wall:

rollstuhlfahrer 27. Okt 2010 20:20

AW: Indizierung von Dateien
 
und vor allem fehlt auch noch die Zeile in der die beschreibende Datei geladen wird. Wenn du eine StringList erzeugst, ist sie normalerweise leer. Dann brauchst du darin auch nicht nach Inhalten zu suchen.

Bernhard

-187- 27. Okt 2010 20:47

AW: Indizierung von Dateien
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1058230)
und vor allem fehlt auch noch die Zeile in der die beschreibende Datei geladen wird. Wenn du eine StringList erzeugst, ist sie normalerweise leer. Dann brauchst du darin auch nicht nach Inhalten zu suchen.

Bernhard

Versteh nicht was du mir damit sagen willst ?!

Also hier nochmal der Code in vereinfachter Form:

Code:
var
  XMLSource, IDList: TStringList;
  FoundCount: Integer;
begin
  XMLSource:=TStringList.Create;
  IDList:=TStringList.Create;
  IDList.Text:=Memo1.Text;
  try
    for i:=0 to IDList.Count-1 do
    begin
      FilePath:=ExtractFilePath(ParamStr(0))+IDList.Strings[i]+'.xml';
      XMLSource.LoadFromFile(FilePath);
      if Pos('MyString',XMLSource.Text)>0 then
        Inc(FoundCount);
      XMLSource.Clear;
    end;
  finally
    IDList.Free;
    XMLSource.Free;
  end;
end;

-187- 27. Okt 2010 21:18

AW: Indizierung von Dateien
 
So ich habe es nochmal genauer ausgearbeitet und gemessen:

Ohne Cache: 9:22 min
Mit Cache: 0:01 min

Und hier noch der benutzte Source Code:

Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  StartTime, EndTime: TDateTime;
  XMLSource, IDList: TStringList;
  i, FoundCount: Integer;
  FilePath, FileName: String;
begin
  XMLSource:=TStringList.Create;
  IDList:=TStringList.Create;
  IDList.Text:=Memo1.Text;
  StartTime:=Time;
  try
    for i:=0 to IDList.Count-1 do
    begin
      FileName:=IDList.Strings[i];
      FilePath:=ExtractFilePath(ParamStr(0))+'XML\'+Copy(FileName,Length(FileName)-1,Length(FileName))+'\'+FileName+'.xml';
      if FileExists(FilePath) then
      begin
        XMLSource.LoadFromFile(FilePath);
        if Pos('MyString',XMLSource.Text)>0 then
          Inc(FoundCount);
        XMLSource.Clear;
      end;
    end;
  finally
    IDList.Free;
    XMLSource.Free;
  end;
  EndTime:=Time;
  ShowMessage(IntToStr(FoundCount)+'   Time: '+TimeToStr(EndTime-StartTime));
end;
Was kann man da Speed technisch noch machen ? Also ohne Cache dauert mir das zu lange...

juergen 27. Okt 2010 21:19

AW: Indizierung von Dateien
 
Hallo,

so ganz steig ich auch nicht durch.
Nach dem laden der TStringList (IDList) würde ich in 2 Schleifen arbeiten.
In der 1. Schleife die Datei in XMLSource zusammenbasteln.
Dann in der 2. Schleife das Pos in der IDList anwenden, oder musst du in der XMLSource suchen? In IDList wäre es etwas schneller weil der jeweilige String kleiner ist.

Du rufst im Moment in der Schleife jedesmal XMLSource.LoadFromFile(FilePath) auf und löschst diese auch wieder. Ob das gut ist?
40.000 Datensätze sollten in wenigen Sekunden(?) durch sein, auch beim ersten Mal, aber nur wenn du direkt in der TStringList suchst und die Oberfläche von den Daten trennst.
Wieviel Arbeitsspeicher verbrauchst du mit deinen Daten?

Bummi 27. Okt 2010 21:25

AW: Indizierung von Dateien
 
@-187-
der Code sieht KISS aus, sollte IMHO flott durchlaufen, was für Datenmengen bewegst Du hierbei insgesamt?

-187- 27. Okt 2010 21:25

AW: Indizierung von Dateien
 
Nein, ich muss in XML Source suchen. IDList stellt nur die Dateinamen die ich lade zur Verfügung. Du kannst ja meinen letzten Code nochmal überfliegen dann sollte es klar sein.

Wieviel Arbeitsspeicher brauch mein Programm ? Gute Frage, wie kann ich das genau messen ? *fg*

-187- 27. Okt 2010 21:26

AW: Indizierung von Dateien
 
Zitat:

Zitat von Bummi (Beitrag 1058251)
@-187-
der Code sieht KISS aus, sollte IMHO flott durchlaufen, was für Datenmengen bewegst Du hierbei insgesamt?

40.000 Dateien, der Durchschnitt liegt bei 3-4 kb pro Datei.

Bummi 27. Okt 2010 21:32

AW: Indizierung von Dateien
 
also ca. 160 MB nicht Welt ...
Stringstreams statt Stringlisten für die innere Schleife werden hier auch nicht bringen, wenn es beim zweiten Durchlauf flott läuft.
Du siehst mich ratlos, sorry, flotte Platte, defragmetieren, Virenscanner die üblichen Verdächtigen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.
Seite 2 von 5     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz