[gelöst] TDataSet; schneller Datenzugriff



  • Hallo,

    ich habe ein TDataSet mit mehreren tausend Datensätzen. Diese Daten sollen in eine Datei gespeichert oder in die Zwischenablage kopiert werden. Dazu habe ich mit For-Schleifen die Daten in einen String geschrieben:

    AnsiString Data = "";
    for (DataSet1->First(); !DataSet1->Eof; DataSet1->Next())
      {
      for (int i=0; i<DataSet1->Fields->Count; ++i)
        {
        Data += DataSet1->Fields->Fields[i]->AsString+"\t";
        }
      Data[Data.Length()]='\n';
      }
    Data.Delete(Data.Length(),1);
    Clipboard()->AsText = Data;
    

    Leider dauert das ziemlich lang.
    Scheinbar dauert das Hinzufügen der Strings zu Data die meiste Zeit. Ich hab schon std::string versucht, aber das ist noch langsamer.
    Hat jemand eine Idee, wie das zu beschleunigen ist?



  • Wenn der Gesamtstring sehr groß ist (mehrere MB), dann könntest du bei std::string zuerst dir mit reserve(x) Speicher reservieren lassen (dann braucht der String nicht immer wieder beim Vergrößeren intern umkopiert werden).
    Bei AnsiString gibt es soetwas (leider) nicht.



  • Danke für den Tip, funktioniert hervorragend. Klappt fast in Echtzeit und sieht jetzt so aus:

    std::string data = "";
    data.reserve(102400); //erstmal 100k reservieren
    for (DataSet->First(); !DataSet->Eof; DataSet->Next())
      {
      for (int i=0; i<DataSet->Fields->Count; ++i)
        {
        data.append((DataSet->Fields->Fields[i]+"\t").c_str());
        if (data.length()+1024 > data.capacity()) //wenn Platz knapp wird
          data.reserve(data.capacity()+102400); //weitere 100k anfordern
        }
      data[data.length()-1]='\n';
      }
    data.erase(data.length()-1,1);
    Clipboard()->AsText = data.c_str();
    

Anmelden zum Antworten