Performanceprobleme Qt4 / Dateien kopieren



  • Hallo. Bin neu hier.
    Folgendes Problem: Habe mit Qt4 eine Backup-Applikation gebaut, die jede Nacht einen Bestimmten Ordner samt Unterordner und Dateien auf eine Netzwerkfestplatte kopiert. Funktioniert soweit auch einwandfrei. Die Applikation läuft jede Nacht um 1:00 Uhr an (per Windows 2000 Server - Geplante Tasks).
    Allerdings braucht das Problem jeden Tag 20 bis 60 Minuten länger für das Kopieren des Ordners (obwohl die Ordnergröße jeden Tag etwa 2-10 MB zunimmt).

    1. Tag - 2h 2m
    2. Tag - 2h 18m
    3. Tag - 2h 33m
    ...
    6. Tag - 3h 33m
    7. Tag - 4h 21m

    Das ist ziemlich problematisch, da es teilweise bis um 5/6 Uhr dauert und um 6 Uhr mit den Daten aus dem Ordner gearbeitet wird und die Daten konsistent sein müssen.

    Woran liegt das? Was kann ich tun, um das ganze zu optimieren?
    Vielen Dank!



  • Was war denn die ursprüngliche Ordnergröße?

    Wie lange dauert eine Kopie mit dem Explorer?

    Wie kopierst du genau? Code?



  • Mit dem Explorer habe ich den Ordner nie kopiert, will ich auch möglichst vermeiden.
    Ursprüngliche Ordnergröße war ca. 16 GB, es kommen jeden Tag zwischen 2 und 10 MB hinzu. Kopiert werden Datenbankdateien (CodeBase DBF/MDX)



  • Die Explorerkopie wäre als Vergleichswert nicht schlecht.

    Dann wäre es gut, wenn du dir ausgaben ins Programm machst und es mal beobachtest.



  • Explorer-Kopie dauert etwa 40 Minuten.
    Ich kann das Programm keine 5 Stunden beobachten, dazu fehlt mir definitiv die Zeit.



  • commx schrieb:

    Ich kann das Programm keine 5 Stunden beobachten, dazu fehlt mir definitiv die Zeit.

    für sowas gibt es Log-Dateien, die dein Programm selbstverständlich erstellen sollte.
    Kopierst du immer wieder alles oder nur die geänderten Dateien?

    Und wie (nicht was) genau kopierst du? (Code-Ausschnitte)



  • Eine Logdatei wird geführt - allerdings wird dort nur geschrieben welche Dateien nicht kopiert werden können.

    #include <iostream>
    #include <time.h>
    #include <QApplication>
    #include <QtGui>
    
    using namespace std;
    QDateTime starttime;
    double mbs_total=0.0, mbs_copied=0.0;
    unsigned int files_copied=0;
    
    void getAllFiles(QString directory)
    {
      QString SrcDir, AlDir = "D:/Origin", TargetDir;
    
      TargetDir = "Q:/Backup";
    
      if (directory == "")
        SrcDir = AlDir;
      else
        SrcDir = directory;
    
      /* Verzeichnisnamen bilden */
      QDir dir(SrcDir);
      QString Target = SrcDir, TargetWo;
      QString TmpTarget;
      Target.replace(AlDir, QString(""));
      TmpTarget = Target;
      TargetWo = TargetDir + "/" + starttime.toString("yyyyMMdd");
      Target = TargetWo + Target;
    
      QFileInfo absPath(Target);
      QString absTargetPath = absPath.absolutePath();
      QDir tDir(TargetDir);
    
      /* pruefe ob das Verzeichnis existiert */
      if (!tDir.exists(starttime.toString("yyyyMMdd")))
        tDir.mkdir(starttime.toString("yyyyMMdd"));
    
      tDir.setPath(TargetWo);
      tDir.mkpath(TargetWo + "/" + TmpTarget);
    
      dir.setFilter(QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks);
      dir.setSorting(QDir::Size | QDir::Reversed);
    
      QFileInfoList list = dir.entryInfoList();
    
      for(int i=0; i < list.size(); ++i)
      {
        QFileInfo fileInfo = list.at(i);
        QString curPath = fileInfo.filePath();
        if (curPath.right(3) == "/.." || curPath.right(2) == "/.")
          continue;
    
        if (fileInfo.isDir())
          getAllFiles(fileInfo.filePath());
        else
        {
          mbs_total += ((double)fileInfo.size() / 1024.0) / 1024.0;
    
          QFile file(fileInfo.absoluteFilePath());
          //cout << "Copy\n  Src = " << fileInfo.absoluteFilePath().toStdString() << "\n  Tgt = " << Target.toStdString() << "/" << fileInfo.fileName().toStdString() << "\n";
          if (file.copy(Target + "/" + fileInfo.fileName()))
          {
            mbs_copied += ((double)fileInfo.size() / 1024.0) / 1024.0;
            files_copied++;
          }
          else
          {
            cout << QString(QString("Kopiere \"%1/%2\" (%3) ... FEHLGESCHLAGEN!").arg(TmpTarget).arg(fileInfo.fileName()).arg(getFileSize(static_cast<unsigned int>(fileInfo.size())))).toStdString();
          }
        }
      }
    }
    
    int main(int argc, char **argv)
    {
      QApplication app(argc, argv);
    
      starttime = QDateTime::currentDateTime();
      getAllFiles("");
    
      return 0;
    }
    


  • Du musst ja nicht die ganzen 5 Stunden warten, bis was sinnvolles sichtbar wird.

    Gib dir einfach einen Timestamp raus, wenn eine Datei kopiert wird.



  • ohne mir alles genau angeschaut zu haben. 40 minuten im explorer sind bei 16GB realistisch, umso unrealistischer erscheinen die 2 stunden beim ersten run deines programmes. da getallfiles() rekursiv ist, prüfe mal ob abbruchbedingungen des rekursiven algorithmusses auch wirklich so eintreten wie du willst.


  • Mod

    Wie sieht der Zeitverlauf denn aus, wenn du nur kopierst, also nicht mitzählst etc.


Anmelden zum Antworten