Frage

Ich fahre eine Dateisuche und es gibt Ausnahmeliste für Verzeichnisse, ist das Problem unter Code iteriert rekursiv durch alle Dateien auf Festplatten. Es funktioniert, aber es ist langsam. Deshalb brauche ich Hilfe um seine Leistung zu optimieren. Vielen Dank im Voraus.

CFileFind finder;

    // build a string with wildcards
    CString strWildcard(directory);
    strWildcard += _T("\\*.*");

    // start working for files
    BOOL bWorking = finder.FindFile(strWildcard);

    while (bWorking)
    {
        bWorking = finder.FindNextFile();

        if (finder.IsDots())
            continue;

        // if it's a directory, recursively search it

        if (finder.IsDirectory())
        {
            CString str = finder.GetFilePath();
            if(NULL == m_searchExceptions.Find(str)){
                _recursiveSearch(str);
            }
            else{
                continue;
            }
        }
        //basic comparison, can be replaced by strategy pattern if complicated comparsion required (e.g. REGEX)
        if(0 == finder.GetFileName().CompareNoCase(m_searchPattern)){
            if(m_currentSearchResults.Find(finder.GetFilePath()) == NULL){
                m_currentSearchResults.AddHead(finder.GetFilePath());       
            }
        }
    }
War es hilfreich?

Lösung

Ich glaube nicht, Sie gehen hier zur Optimierung der Leistung zu können. Du wirst 80 Ausgaben werden +% Ihrer Zeit in FindFirstFile und FindNextFile hier (Windows-API-Aufrufe), egal was Sie in Bezug auf die Optimierung auf Ihrer Seite zu tun.

fragte ich eine ähnliche Frage bereits und haben noch eine Antwort zu erhalten.

Andere Tipps

Sieht aus wie Ihr m_currentSearchResults ist eine Liste, und jedes Mal, wenn Sie finden, um einen Dateinamen es aussehen, wenn es bereits in der Liste enthalten ist. In dem Fall, wenn Sie viele der gefundenen Dateien (etwa hundert) haben, kann dies zu einem Engpass werden, wie es O(N^2) Komplexität hat. Wenn dies der Fall ist, sollten Sie einen CMap verwenden stattdessen als es gibt O(log N) Sie suchen (ein Satz wäre noch besser geeignet als eine Karte, aber Sie tun dies nicht in MFC haben, aber Sie können auch die Standard-Bibliothek std::set stattdessen verwenden).

Wie langsam? Hast du es Profil? Wenn Sie rekursiv Dateien auf Ihrer Festplatte suchen extrem ist es wahrscheinlich, du bist I / O gebunden und es gibt nichts, was man kurz von immer schneller Speicher-Hardware (wie Solid State) tun können.

Sie machen eine allgemeine Suche nach einer Datei. Es gibt eine Million Produkte gibt, die dies auch tun, und sie alle nutzen die Indizierung als Optimierung. Das schwache Glied ist hier sicherlich die Festplatte, nicht den Code. Vergleicht man 1.000.000 Strings wird keine Zeit überhaupt nimmt im Vergleich zu der Zeit eine Million Dateien auf der Festplatte aufzuzählen es dauert.

Es gibt zwei grundlegende Fragen auf die Leistung hier: Festplattenzugriff und Directory Traversal. Sowohl Sie als können der Lage sein, auf zu optimieren.

Hard Drive Optimierung

Eine Festplatte in Ruhe neigt in Ruhe zu bleiben. Ein Spinnzylinder mag Spinnen zu halten. So sagte die Engpässe in der Festplatte zugreifenden es Anfahren, Suchzeit und Lesezeit. Die Verringerung der Menge der Zugriffe und die Erhöhung der Datenmenge pro Lese Ihre Leistung erhöhen.

Der Speicherzugriff ist schneller als Festplattenzugriff. So große Stücke von Daten in den Speicher schleppen, dann Speicher suchen.

Optimizing Verzeichnissuche.

Stellen Sie sich vor, wenn Sie möchten, einen Baum von „Seiten“. Jeder Knoten im Baum ist ein Verzeichnis von Null oder mehr Verzeichnissen oder Dateien. Leider ist in den meisten Betriebssystemen wird diese Datenstruktur nicht für eine effiziente Suche optimiert.

Die ideale Situation ist zu Strecken in allen relevanten Verzeichnisse in den Speicher sie dann suchen (im Speicher). Sobald der Speicherort der Datei bekannt ist, zufälliger Zugriff auf die Datei ist relativ schnell. Das Problem ist die Verringerung Suchzeit, indem nur die entsprechenden Verzeichnisse zu lesen; das heißt die Anzahl irrelevanten Verzeichnisses reduziert ausliest.

Die meisten Anwendungen, die Dateisuche auf einer Festplatte lesen Sie das Laufwerk durchführen und ihre eigenen optimierte Datenstruktur (en). Dies kann nicht optimal für große Festplatten mit enormouse Mengen von Dateien oder Fällen von wenige Datei sucht sein.

Wenn Sie können, sagen die OS so viele Verzeichnisse im Speicher wie möglich zu halten.

Verbesserung der Performance: Die Reduzierung andere Anwendungen

.

Für einige Anwendungen hängt die wahrgenommene Leistung Zeit für andere Anwendungen, die zur gleichen Zeit ausgeführt werden. Ausführen eines Compiler und eine Internet-Suche gleichzeitig wird sich verlangsamen den meisten anderen Anwendungen. So versuchen, andere Anwendungen zu beseitigen, die nicht notwendig sind, aus gleichzeitig mit Ihnen ausgeführt wird. Außerdem investieren die Priorität Ihrer Anwendung rasing.

1 für Profil zunächst sicher sein. Auch scheint dies wie ein Problem, das auch die Task Parallel Bibliothek Verwendung gelöst werden konnte - starten Sie eine Aufgabe, wie Sie jedes Verzeichnis zu sehen, und alle diese Kerne auf Ihrer CPU verwenden -

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top