In einer Datei, an einer bestimmen stelle springen



  • Hallo,

    wie kann man in einer Datei an einer bestimmen stelle springen und dann auslesen?

    Das Problem ist die Datei ist 44MB groß und die Blöcke sind mit ein KOMMA getrennt. z.B. 1111,2222,3333,4444, ...

    Das heißt wen ich in Zeile 199 und spalte 4555 was auslesen muss.

    Wie komme ich daran ohne alles einlesen zu müssen.



  • Gar nicht. Du musst schon alles bis dahin einlesen.
    Theoretisch kannst du natürlich den Lesezeiger an ein Position setzten. Die Frage ist hier eher woher du wissen willst wohin. Dazu musst du den genauen binären Aufbau deiner Datei kennen. Bei dir ist es wohl eine Textdatei. Da wird das schwierig.
    Wenn du Geschwindigkeit rausholen willst kannst du die Datei erstmal binär vollständig einlesen und dann die Position suchen. Blockweises binäres Einlesen ist im Allgemeinen viel schneller als Text einlesen da hier die Interpretation der eingelesenen Zeichen flach fällt. Nützlich ist es hier noch den Lesepuffer anzupassen.
    44MB ist aber nun nicht so groß. Da würde ich mir den Aufwand nicht machen.



  • Braunstein schrieb:

    Wenn du Geschwindigkeit rausholen willst kannst du die Datei erstmal binär vollständig einlesen und dann die Position suchen. Blockweises binäres Einlesen ist im Allgemeinen viel schneller als Text einlesen da hier die Interpretation der eingelesenen Zeichen flach fällt. Nützlich ist es hier noch den Lesepuffer anzupassen.
    44MB ist aber nun nicht so groß. Da würde ich mir den Aufwand nicht machen.

    @Braunstein
    Ab welcher Größe würdest Du dies denn empfehlen, und wie würdest Du binär einlesen, also mit welchen Funktionen (Streams, open, fopen, ...)?
    Habe nämlich ein ähnliches Problem, muß viele (500-5000) kleine Dateien (bis 250KByte) nach verschiedenen Pattern durchsuchen.
    Hierzu lese ich die Daten momentan in einen String (wchar_t[]) ein und verwenden dann einen Pattern-Matching Algo.
    Würde das ganze gerne noch etwas schneller machen.

    MfG Stephan



  • So ab 100MB merkt man schon einen Unterschied. Das hängt natürlich auch von der Festplatte ab. Ich verwende derzeit streams setze aber einen eigenen Lesepuffer.

    std::vector<char> internalBuffer(CHUNKSIZE, 0);
    m_inputStream.rdbuf()->pubsetbuf(&internalBuffer[0], CHUNKSIZE);
    m_inputStream.open(m_filename.str().c_str(), std::ios_base::binary);
    

    Zum Lesen nehme ich einfach read und lese in Chunks

    inputStream.read(buffer, chunksize))
    

    Das Lesen geht so recht schnell, nur das Auswerten dauert etwas. Wie groß der Puffer sein muss muss man ausprobieren. Ich nehme derzeit 4096. Größere Puffer haben bei mir keinen Geschwindigkeitsgewinn gebracht.

    Bei vielen kleinen Dateien hilft binäres Lesen auch nicht unbedingt. Unter Windows und mit einer normalen HDD dauert das einfach nur sehr lange. Bei Nutzung einer SSD geht das deutlich schneller. Hier ist das ständige Öffnen und Schliessen und das Suchen der Dateiposition auf der Platte der Flaschenhals.



  • Danke für die Information 🙂



  • Ich danke auch für ausführliche Erklärung.
    Vermutlich kann ich das ganze Thema nochmals zurückstellen, denn meine Daten kommen übers Netzwerk von einem Dateiserver, was das ganze sicherlich nicht schneller macht. 🙄

    MfG Stephan



  • Netzwerktransfer kann das Ganze schon langsamer machen.
    Kann man die ganzen Dateien vor dem Transfer nicht packen und dann am Stück übertragen? Ein Skript auf dem Server könnte sowas doch erledigen.



  • Braunstein schrieb:

    Netzwerktransfer kann das Ganze schon langsamer machen.
    Kann man die ganzen Dateien vor dem Transfer nicht packen und dann am Stück übertragen? Ein Skript auf dem Server könnte sowas doch erledigen.

    Der Benutzer filtert quasi in meinem Programm die Dateien.
    Dies würde ja dann bedeuten, daß ich diese Info erstmal an das Serverskript übergeben muß, die Daten packen und anschließend übertragen.
    Meinst Du das dies signifikant schneller wird?
    Ist der Overhead des Kopierens wirklich so groß?
    Ich kann's noch nicht so ganz glauben. Andererseits wenn ich mir anschauen wie lange es dauert viele kleine Dateien zu kopieren im Gegensatz zu einer Großen!?

    Muß ich mal bei Gelegenheit ausprobieren.
    Danke.
    MfG Stephan



  • Wie läuft denn sowas z.B. auf Youtube?
    Da kann man doch auch, ohne preload, an eine beliebige Stelle im Video springen.
    Ist vielleicht das falsche Forum. Interessiert mich aber trotzdem.
    Danke


Log in to reply