Inhalt einer Datei 'zwischenspeichern'. Nur wie ...?



  • Moin Gemeinde,

    wie würdet ihr folgendes Problem lösen:

    Einlesen von Textfiles?
    Zwischenspeichern des Inhaltes?

    Es geht darum: Ich muss in meiner App Textdateien zeilenweise einlesen. Die Einträge können dann geändert werden und müssen auch wieder gespeichert werden( eh klar 🙄 ).
    Zeilenweise deshalb, weil die gespeicherte Datei wie die Originaldatei aussehen soll( Änderungen ausgenommen ). Format meine ich.

    Diese Dateien haben nicht selten > 1.000.000 Zeilen.
    Der eine oder andere ahnt es vllt. schon, es geht um Performance!

    z. B. dauert es - auf einem gut ausgestatteten Rechner - ca 6 Min. bis eine Datei mit 1.220.000 Zeilen eingelesen und der Inhalt zeilenweise in eine Listbox gepackt wurde.
    In ein ListCtrl dauert es noch länger. Vom Sortieren in einem ListCtrl will ich jetzt gar nichts sagen.
    ( habe mir mal das UltimateGrid angesehen, dauert noch länger )

    Verwende zum lesen akt. CStdioFileEx( VC6 mit Unicode lesen / schreiben ), und zum zwischenspeichern ein Struct( 3 x int und 2 x CString( sollte bleiben ) ) in einem std::vector.

    Also, wie kann ich da noch was tunen? Was würdet ihr machen?

    Bin für alle Tipps offen und dankbar.

    grüssle 🙂



  • Pack die Daten nicht in ein Windows Control (Listbox, ...), DAS dauert am längsten an der ganzen Sache.
    Versuch mal eine 100MB Textdatein in Notepad aufzumachen, das dauert EWIG. Die selbe Datein in Visual Studio aufmachen geht zig mal schneller.

    Es könnte auch etwas bringen wenn du die Structs nicht in einen std::vector legst sondern in einen boost::ptr_vector, std::deque oder std::list (wenn du keinen Random Access brauchst).


  • Mod

    Und warum verwendest Du keine virtuelle CListCtrl?

    Ich würde jede Zeile in einen eigenen Speicherblock setzen vector<CString> oder vector<string>.
    Dann würde ich einfach die Anzahl der Zeilen den CListCtrl mitteilen und das wars.
    Das CListCtrl sendet Nachrichten, wenn es eine bestimmte Info will und die gibts die ihm.

    Das spart auch Speicher, weil die Daten nur einmal im Specher sind und nicht auch noch im Control gehalten werden müssen.



  • hustbaer schrieb:

    Pack die Daten nicht in ein Windows Control (Listbox, ...), DAS dauert am längsten an der ganzen Sache.
    Versuch mal eine 100MB Textdatein in Notepad aufzumachen, das dauert EWIG...

    Ist klar, muss aber leider sein.

    hustbaer schrieb:

    Es könnte auch etwas bringen wenn du die Structs nicht in einen std::vector legst sondern in einen boost::ptr_vector, std::deque oder std::list (wenn du keinen Random Access brauchst).

    Leider auch nicht wirklich viel. das Problem ist das CListCtrl, und an dem Teil komme ich nicht vorbei 😞

    Martin Richter schrieb:

    Und warum verwendest Du keine virtuelle CListCtrl?

    Ich würde jede Zeile in einen eigenen Speicherblock setzen vector<CString> oder vector<string>.
    Dann würde ich einfach die Anzahl der Zeilen den CListCtrl mitteilen und das wars.
    Das CListCtrl sendet Nachrichten, wenn es eine bestimmte Info will und die gibts die ihm.

    Das spart auch Speicher, weil die Daten nur einmal im Specher sind und nicht auch noch im Control gehalten werden müssen.

    Hört sich interessant an. Werd mal damit testen.

    BIG THX euch zwei erstmal

    grüssle 🙂



  • Martin Richter schrieb:

    ...Dann würde ich einfach die Anzahl der Zeilen den CListCtrl mitteilen und das wars...

    😕 Das wäre super, nur wie?

    grüssle 🙂


  • Mod

    Hast Du schon mal was von der MSDN gehört? Vermutlich 🕶

    http://msdn2.microsoft.com/en-us/library/ye4z8x58(VS.80).aspx



  • Natürlich kenne ich die MicroSoft Dokumentiert Nicht ;).
    Musste mal mit Bilder für WinCE( IImage ) arbeiten.

    Problem hier ist, dass ich hier mit VC6 arbeite, aber die MSDN Sept. 2007 habe. Und da ist eben auch einiges dabei, das ich nicht gebrauchen kann.

    grüssle 🙂


  • Mod

    Keine Ausrede 🕶 , dieser Artikel ist bereits in der MSDN von VC6 drin gewesen und mindestens 6 Jahre alt...



  • Ok, *blitzartiginDeckunggeh*

    habs mal testweise eingebaut. Allerdings bin ich jetzt doch sehr überrascht, das ist das langsamste, was ich je gesehen habe.
    Bei einer Listengröße von knapp über 100000 Einträgen, 3 Spalten, kann ich sehen wie die Liste Zeilenweise, Spalte für Spalte aufgebaut wird.
    Auf einfache Clicks in die Liste wird nach ca 3 - 5 Sek. reagiert. Dabei wird zuerst die neue Zeile - Spalte für Spalte - selektiert, und nach ca 5 Sek. die vorherige Auswahl( eine Zeile! ) wieder - Spalte für Spalte - deselektiert.

    Liegt das an meinem Code?

    Hier mal:

    void CFileReaderView::OnGetdispinfoList1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    
        LV_ITEM* pItem= &(pDispInfo)->item;
        int itemid = pItem->iItem;
    
        if (pItem->mask & LVIF_TEXT)
        {
            CString text;
    
            switch( pItem->iSubItem )
    		{
    			case 0:
    		        text = GetStringFromVectorForListCtrl( itemid, 0 );
    				break;
    			case 1:
    	            text = GetStringFromVectorForListCtrl( itemid, 1 );
    				break;
    			case 2:
    	            text = GetStringFromVectorForListCtrl( itemid, 2 );
    				break;
    		}
    
            lstrcpyn( pItem->pszText, text, pItem->cchTextMax );
        }
    
    	*pResult = 0;
    }
    

    Die Funktion GetStringFromVectorForListCtrl liefert den jeweiligen Eintrag für die Zeile/Spalte.
    Wenn alles so schnell wäre wie diese Funktion, gäbe es diesen Eintrag nicht 🕶

    Oder hab ich was vergessen?

    btw. wie siehts überhaupt dann mit Sortieren einer Virtual LisCtrl aus? hab mal gegoogled, aber nix brauchbares gefunden. Geht wohl so nicht?!

    grüssle 🙂



  • Hey Smitty
    ich muss mal ganz blöd fragen wie du es überhaupt geschafft hast eine Datei zeilenweise auszulesen 😇 und diese dann in Variablen zu speichern 😇



  • Lenni schrieb:

    Hey Smitty
    ich muss mal ganz blöd fragen wie du es überhaupt geschafft hast eine Datei zeilenweise auszulesen 😇 und diese dann in Variablen zu speichern 😇

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-198773.html


  • Mod

    Das ist nur deshalb lahm weil Dein GetStringFromVectorForListCtrl, lahm ist.

    Ersetze diese Funktionen mal durch simple Operationen, die nur die Zeilenzahl, und die akteulle Uhrzeit anzeigen. Du wirst sehen, dass es schneller nicht geht.



  • Hattest Recht, wie immer 😡 🙄 😉

    hab jetzt noch einen vector 'zwischengeschaltet', der nur die Einträge, bereits formatiert, enthält, die auch in das ListCtrl kommen.
    Dadurch wurde die Zeit zum Laden der 105 MB grossen Datei, das einlesen in die vector's, das formatieren der Einträge und das 'Füllen' des ListCtrl's von ca. 6 Min. auf ca. 24 Sek. runtergeschraubt 🕶

    thx & grüssle 🙂

    Edit: Sortieren dann von Hand, oder? bei Virtuel ListXXX hab ich nix gefunden 😞


Anmelden zum Antworten