grosse dateien effektiv auslesen



  • mahlzeit

    es geht darum -

    bister hab ich immer die datei mit CFile geoeffnet - ein teil ausgelesen - innen vector und dann das naechste teil auslesen

    der vorteil dabei ist das die datei auch groesser sein kann

    if( cfile.Open( m_csFileName, CFile::modeRead | CFile::typeBinary, &ex ) )
    {
        const int iSIZE = 512;
        byte bBuffer[ iSIZE ] = { '\0' };
        UINT uiRead =0;
        while( uiRead = cfile.Read( bBuffer, iSIZE ) )
        {
            if( uiRead <= iSIZE )
                m_vContent.insert( m_vContent.end(), &bBuffer[0], &bBuffer[uiRead] );
        }
        cfile.Close();
    }
    

    achso und ich lese binaer aus {brauch ich fuer den spaeteren ablauf

    nu stellt sich mir die frage

    was ist mit

    std::ifstream file( m_csFileName );
    std::copy( std::istream_iterator< char >( file ), std::istream_iterator< char >(), std::back_inserter( m_vContent ) );
    

    wuerde das funktionieren und vor allem binaer ?
    wie ist das mit der laufzeit und bei besonders grossen dateien ?
    {laenge und inhalt alles unbekannt}



  • probiers doch aus.

    Es wird halt die ganze Datei in den Speicher gelesen. Aber das tust du bei der CFile-Variante ja auch. Dass das, bei Gigabyte-Größenordnungen. nicht mehr so gut ist, sollte klar sein.



  • Die ganze Datei in den Speicher zu laden ist extrem schlecht.



  • aaaaaaa schrieb:

    Die ganze Datei in den Speicher zu laden ist extrem schlecht.

    in diesem fall aber notwendig {o; - genaueres darf ich nicht sagen {o;

    es geht halt darum, in der CFile variante les ich nur ein teil aus und pack den innen vector, dann der naechste teil

    der vorteil dabei ist das man den gesamten inhalt erst im vecor hat nicht in der zwischen variable

    zudem noch die frage ob es auch binaer ausgelesen wird bei der fstream variante - das ist besonders wichtig

    durch testen seh ich grad {beim auslesen des speichers im debugger} das in der ifstream variante der gesamte inhalt ohne leerzeichen gespeichert wird, das darf natuerlich nicht sein



  • Mr Evil schrieb:

    const int iSIZE = 512;
    ...
        while( uiRead = cfile.Read( bBuffer, iSIZE ) )
    

    ja, das ist schonmal brauchbar. iSIZE sollte 4096 sein, denn soe viel liest Win auf einen hops nach meinen messungen. wäre auch recht sinnvoll in sachen speicherseiten.

    wie ist das mit der laufzeit und bei besonders grossen dateien ?
    {laenge und inhalt alles unbekannt}

    nicht super. das lesen selbst ist recht fix. vielleicht zwischen 95% und 99% des optimums. aber das speichern im speicher ist die hölle. das umkopieren geht ja auich noch, aber das besorgen des soeichers, das anwerfen dewr auslagerunfgsdatei, nur um ne kopie von daten zu kriegen, die eh auf platte liegen. aua.

    alle modernen betriebssysteme für x86-rechner haben kram, um ne auslagerungsdatei zu benutzen. und sie biten darüberhinaus dem programmierer an, den selben kram für eigene dateien zu verwenden. was du für riesige dateien machen musst, ist folgendes: bitte dein betriebssystem, die den gesamten dateiinhalt in deinen adressraum zu spiegeln, so als wäre es eine kleine private auslagerungsdatei. dabei wird noch kein physikalischer soeicher verwendet. wenn du dann auf speicher in dem spiegelber3ich zugreifst, wird automatisch aus der datei geladen. und es wird auch automatisch ram dafür freigemacht (auch aus deinen spiegelseiten), wenn nicht mehr gebraucht. du sparrst dir damit alles umkopieren und hast optimale performance. für win schau nach CreateFileMapping() und für andere betriebssysteme schau nach mmap().



  • vielen dank fuer die ausfuehrliche info

    ich hab das problem des auslesen mitlerweile so geloest

    std::ifstream file( pcFileName, std::ios_base::binary );
    if( !file.is_open() )
    	return ERR_ATTACH;
    std::copy( std::istreambuf_iterator< char >( file ), std::istreambuf_iterator< char >(), std::back_inserter( m_vContent ) );
    

    was du alles ueber das spiegeln usw schreibst muss ich spaeter wenn ich mehr zeit und muse hab nochmal durchlesen #gg

    auf jeden fall brauch ich saemtliche daten aus einer datei - muss die convertieren und in einer neuen datei abspeichern

    mir unbekannt ist des format in dem es kommt und das format in dem es gespeichert wird - auch die groesse der datei - und die quelldatei darf nicht manipuliert werden

    das 1gb dateien damit benutzt werden ist sehr unwahrscheinlich - ich denk mir maximal 10 oder 20mb daten

    das programm hab ich ja shcon laenger funktionierend am laufen - wollte nur wissen wegen effektivitaet wenns 20mb dateien sind {oder gar groesser}

    hab eigentlich schon zuviel gesagt {is n komerzielles produkt #gg}

    danke nochmal und gruss



  • warum nicht dateigröße ermitteln, speicher für die ganze datei holen und dann ein Read-aufruf direkt in den vector?



  • mir unbekannt ist des format in dem es kommt und das format in dem es gespeichert wird

    Was machst du dann überhaupt mit den Daten?



  • Mr Evil schrieb:

    das 1gb dateien damit benutzt werden ist sehr unwahrscheinlich - ich denk mir maximal 10 oder 20mb daten

    Dann wuerd ich mir mal nicht gross Gedanken drueber machen. "GROSSE" Dateien sind ganz was anderes.

    hab eigentlich schon zuviel gesagt

    🙄 Wir werden jetzt alle Dateiformats-Kopierprogramme schreiben und deiner Firma den Auftrag wegnehmen....



  • Blue-Tiger schrieb:

    🙄 Wir werden jetzt alle Dateiformats-Kopierprogramme schreiben und deiner Firma den Auftrag wegnehmen....

    wer sagte das ich sowas mach ? #gg
    mein tool ist nur ein bestandteil und wird fuer das erstellen der eigentlichen programme benoetigt {o;

    nu is gut #gg


Anmelden zum Antworten