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 21mDas 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.
-
Wie sieht der Zeitverlauf denn aus, wenn du nur kopierst, also nicht mitzählst etc.