Einzelnen Beitrag anzeigen

Benutzerbild von Reinhardtinho
Reinhardtinho

Registriert seit: 26. Feb 2007
411 Beiträge
 
Delphi 5 Enterprise
 
#1

Viele Datensätze nacheinander erstellen

  Alt 22. Jan 2008, 14:02
Datenbank: SQL Server 2000 • Zugriff über: SDAC-Komponenten
Hi,

ich habe mir ein kleines Musik-Verwaltungstool gebastelt, dass die Dateien in einem Ordner sucht und die Informationen in einem neuen Datensatz in einer Datenbank speichert (Name, Pfad, einige ID3-Tags, ggf. Cover).

Wenn ich die Suche starte, läuft das Programm noch sehr schnell, es werden so ca. 20-40 Datensätze pro Sekunde eingefügt.

Doch ab 5000 etwa wird es sehr langsam und am Ende braucht das Tool 1-2 Sekunden pro Datensatz. Das Taskmanager zeigt an, dass der Prozess sqlservr.exe einen virtuellen Speicher von etwa 500.000k hat.

Ich hab es auf meinem Laptop (WinXP - SP2, 2 GHz, 512 MB Ram) laufen.

Hier nochmal kurz der Code, wie ich die Datensätze erstelle, der immer aufgerufen wird, wenn das Programm eine mp3-Datei gefunden hat.

Delphi-Quellcode:
  try
    if MSTable_Wrk.Locate('Pfad', FileName, [loCaseInsensitive]) then
    begin
      MSTable_Wrk.Edit;
      Inc(ChangedFiles);
    end
    else
    begin
      MSTable_Wrk.Append;
      Inc(NewFiles);
    end;

    if Assigned(OnTTDProgress) then
      OnTTDProgress(self, NewFiles, ChangedFiles);

    with MSTable_Wrk do
    begin
      FieldValues['Pfad'] := FileName;
      FieldValues['Name'] := StringReplace(ExtractFileName(FileName), ExtractFileExt(FileName), '', []);
      FieldValues['Ordner'] := ExtractFilePath(FileName);

      FTyp := LowerCase(ExtractFileExt(FileName));

      if (Pos('.', FTyp) > 0) then
        FTyp := Copy(FTyp, 2, Length(FTyp) - 1);

      FieldValues['Typ'] := FTyp;

      FGroesse := FormatFloat('0 B', Dateigroesse);

      if (Dateigroesse DIV 1024 > 0) then
        FGroesse := FormatFloat('#,##0.00 KB', Dateigroesse / 1024);

      if (Dateigroesse DIV 1048576 > 0) then
        FGroesse := FormatFloat('#,##0.00 MB', Dateigroesse / 1048576);

      if (Dateigroesse DIV 1073741824 > 0) then
        FGroesse := FormatFloat('#,##0.00 GB', Dateigroesse / 1073741824);

      if ((Dauer MOD 60) > 9) then
        FDauer := IntToStr(Dauer DIV 60) + ':' + IntToStr(Dauer MOD 60)
      else FDauer := IntToStr(Dauer DIV 60) + ':0' + IntToStr(Dauer MOD 60);

      FieldValues['Groesse'] := FGroesse;
      FieldValues['Interpret'] := Artist;
      FieldValues['Titel'] := Titel;
      FieldValues['Album'] := Album;
      FieldValues['Jahr'] := Year;
      FieldValues['Genre'] := Genre;
      FieldValues['Lyrics'] := Lyrics;
      FieldValues['Dauer'] := FDauer;
      FieldValues['Bitrate'] := Bitrate;
      FieldValues['Vbr'] := Vbr;
      FieldValues['ChannelMode'] := ChannelMode;
      FieldValues['Samplerate'] := Samplerate;
      FieldValues['Schreibgeschuetzt'] := FReadOnly;
      FieldValues['Versteckt'] := FHidden;
      FieldValues['Erstelldatum'] := Created;
      JvDBImage1.Picture.Assign(JvID3v21.Images.Pictures.CoverFront);

      Post;
    end; (* of with *)

    JvID3v21.Active := False;
  except
    //
  end;
Gibt es eine Möglichkeit die Suche + Erstellung der Datensätze dauerhaft mit der Geschwindigkeit wie zu Beginn auszuführen?


P.S.: Die MSTable_Wrk-Komponente ist nicht mit einer visuellen Komponente verknüpft.


Vielen Dank und freundliche Grüße
Lorenz
Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler
  Mit Zitat antworten Zitat