[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();