Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ich empfehle, zunächst eine minimale Änderung vorzunehmen, damit die Neuzuweisung von Speicher weniger häufig erfolgt. Zwei Zeilen
m_total_rows++;
ArrayResize(m_cells,m_total_rows*m_total_columns,10000);
in bool CSVReader::AddData(string data_str,bool header) ersetzen durch
m_total_rows++;
if (m_total_rows*m_total_columns>ArraySize(m_cells)) ArrayResize(m_cells,2*m_total_rows*m_total_columns);
Die Anzahl der Speicherneuzuweisungen mit Kopieren sollte O(log(n,2)) statt O(n) werden. 20 anstelle von 600 Tausend. Vielleicht ist das jetzt genug für Sie.
Ich danke Ihnen! Ich möchte Sie wissen lassen, was ich habe:
1. Keine Veränderung des Speichers - um 10 Gigabyte hat der aktuelle Code hier und da RAM gefressen.
2. Nach Geschwindigkeit:
2.1 Alte Version 574 Sekunden
2.2 Neue Version: 138 Sekunden.
Sie erhalten also einen 4-fachen Gewinn, was ziemlich gut ist! Allerdings ist der Speicherplatz knapp, und das ist bei weitem nicht alles, was geladen werden muss....
sehr praktisch :)
Also habe ich CSV in Binärdateien umgewandelt, ohne das Datum.
Wie sich herausstellte, beanspruchte das Skript bei der Ausführung 1 Gigabyte Speicherplatz, was im Vergleich zu 10 Gigabyte sehr gut ist. Aber immer noch eine Menge :)
Was die Geschwindigkeit betrifft - nur 16 Sekunden! Ziemlich gut!
Ich empfehle, zunächst eine minimale Änderung vorzunehmen, damit die Neuzuweisung von Speicher weniger häufig erfolgt. Zwei Zeilen
m_total_rows++;
ArrayResize(m_cells,m_total_rows*m_total_columns,10000);
in bool CSVReader::AddData(string data_str,bool header) ersetzen durch
m_total_rows++;
if (m_total_rows*m_total_columns>ArraySize(m_cells)) ArrayResize(m_cells,2*m_total_rows*m_total_columns);
Die Anzahl der Speicher-Neuzuweisungen mit Kopieren sollte O(log(n,2)) statt O(n) werden. 20 anstelle von 600 Tausend. Vielleicht reicht das für Sie aus.
Eigentlich ist der dritte Parameter für ArrayResize() aus einem bestimmten Grund angegeben... Das ist eine schlechte Veränderung.
Lesen Sie die Dokumentation
Eigentlich ist der dritte Parameter für ArrayResize() aus einem bestimmten Grund angegeben... eine federleichte Veränderung...
Lesen Sie die Dokumentation
Was haben Sie aus der Dokumentation über den dritten Parameter herauslesen können, der in diesem Fall nützlich ist, wenn es darum geht, eine .csv-Datei in den Speicher zu heben, die in verschiedenen Programmen erstellt wurde und eine beliebige Größe hat?
Fühlen Sie sich frei, eine bessere, nicht-binäre Änderung vorzuschlagen, die die Geschwindigkeit der Speicher-Neuzuweisung (Reduzierung der Anzahl der ArrayResize-Aufrufe) mehr als die binäre Suche erhöht...
Ich danke Ihnen! Ich werde Sie wissen lassen, was dabei herauskommt:
1. Keine Veränderung des Arbeitsspeichers - um 10 Gigabyte hat der aktuelle Code hier und da RAM gefressen.
2. Nach Geschwindigkeit:
2.1 Alte Version 574 Sekunden
2.2 Neue Version: 138 Sekunden.
Sie erhalten also einen 4-fachen Gewinn, was ziemlich gut ist! Allerdings ist der Speicherplatz knapp, und es ist nicht allzu viel zu laden....
Nach dem Lesen, in bool CSVReader::Load(int start_line), nach der Zeile
FileClose(filehandle);
Speicherfreigabe einfügen
ArrayResize(m_cells,m_total_rows*m_total_columns);
Gibt unnötige 0-50% des von m_cells belegten Speichers frei. Nur m_cells selbst, ohne Zellinhalte.
Jetzt mache ich eine kleine Bibliothek für schnelle CSV-Verarbeitung.
Auf dem Screenshot ist ein Testlauf zu sehen, der in 7 Sekunden abgeschlossen ist!!! Xeon-Prozessor, Frequenz 3.0.
Zunächst erstellt das Skript das Datenformat für jede Spalte. Es gibt 6 Spalten. Dann werden der Tabelle 1000000 Zeilen hinzugefügt, die dann mit Zahlen von 0 bis 999999 gefüllt werden. Je nach Datenformat können die Zahlen unterschiedlich wahrgenommen werden. Dann wird alles in einer Datei gespeichert.
Die Datei ist 65,4 MB groß. Die gesamte Struktur beanspruchte 232 MB im Speicher.
Also habe ich CSV in Binärdateien umgewandelt, ohne das Datum.
Wie sich herausstellte, beanspruchte das Skript bei der Ausführung 1 Gigabyte Speicherplatz, was im Vergleich zu 10 Gigabyte sehr gut ist. Aber immer noch eine Menge :)
Was die Geschwindigkeit betrifft - nur 16 Sekunden! Ziemlich gut!
Nun, das Skript selbst ist immer noch verkrüppelt.
Nach dem Lesen, in bool CSVReader::Load(int start_line), nach Zeile
FileClose(filehandle);
Speicherfreigabe einfügen
ArrayResize(m_cells,m_total_rows*m_total_columns);
Gibt die unnötigen 0-50% des von m_cells belegten Speichers frei. Nur m_cells selbst, ohne Zellinhalte.
Danke, aber nach dem Schließen der Datei/der Beendigung des Skripts wird der Speicher ohnehin schnell wieder freigegeben. So können Sie den Verbrauch beim Laufen reduzieren....
Jetzt mache ich eine kleine Bibliothek für schnelle CSV-Verarbeitung.
Auf dem Screenshot ist ein Testlauf zu sehen, der in 7 Sekunden abgeschlossen ist!!! Xeon-Prozessor, Frequenz 3.0.
Zunächst erstellt das Skript das Datenformat für jede Spalte. Es gibt 6 Spalten. Dann werden der Tabelle 1000000 Zeilen hinzugefügt, die dann mit Zahlen von 0 bis 999999 gefüllt werden. Je nach Datenformat können die Zahlen unterschiedlich wahrgenommen werden. Dann wird alles in einer Datei gespeichert.
Die Datei ist 65,4 MB groß. Die gesamte Struktur beanspruchte 232 MB im Speicher.
Ziemlich interessant. Planen Sie, Ihre Programmierleistungen öffentlich zu veröffentlichen?
Nun, das Drehbuch selbst ist immer noch ein Chaos.
Können Sie mir sagen, was ich daran ändern kann?