MT5 RAM-Speicherüberfluss, Probleme beim Lesen/Schreiben großer Dateien - Seite 7

 
Es stellte sich heraus, dass mein Terminal ohne das Skript 820 MB verbraucht, so dass die Binärdatei 180 Megabyte verbraucht, was angesichts der zwei gefüllten Arrays offenbar in Ordnung ist.
 
Das Thema ist nicht ganz korrekt formuliert.

Der Speicher wird nicht vom Terminal, sondern von einem bestimmten Programm mit einer bestimmten Implementierung verbraucht. In diesem Fall speichert das MQL-Programm Daten falsch und ineffizient.
 
Aleksey Vyazmikin:

Können Sie mir sagen, was ich daran ändern kann?

Nun, es ist in Ordnung, dass Sie das Array zuerst lesen, aber nachdem Sie es gelesen haben, müssen Sie die Datei schließen.

und schreiben Sie dann auf dieselbe Weise, nicht über Ihre Bibliothek.

 
Renat Fatkhullin:
Das Thema ist nicht ganz korrekt formuliert.

Der Speicher wird nicht vom Terminal, sondern von einem bestimmten Programm mit einer bestimmten Implementierung verbraucht. In diesem Fall speichert das MQL-Programm Daten falsch und ineffizient.

Das Thema wurde zum Zeitpunkt des Auftretens des Problems formuliert, als die Ursachen noch nicht abschließend geklärt waren. Ich bin von der Tatsache ausgegangen, dass ich eine Klasse habe, die unter Mitwirkung eines MQ-Mitarbeiters erstellt wurde, so dass ich keinen Grund hatte, an ihrer Korrektheit zu zweifeln.

Wenn das Programm Daten nicht korrekt und effizient speichert, können Sie mir dann sagen, wie ich sie korrekt und effizient speichern kann? Was sollte ich an der Klasse ändern, damit sie weniger Speicherplatz verbraucht?

Generell wäre es sehr schön, wenn das Terminal mit einer ähnlichen Klasse für die Arbeit mit CSV-Tabellen geliefert würde.

 
Maxim Dmitrievsky:

Es ist in Ordnung, das Array zuerst zu lesen, aber nachdem Sie die Datei gelesen haben, müssen Sie sie schließen

und schreiben Sie auf dieselbe Weise, nicht über Ihre Bibliothek.

Ich werde sie schließen, danke.

Ich muss in zwei Varianten schreiben, weil ich im CSV-Format besser sehen kann, was in den Arrays vor sich geht - leider mache ich Fehler, und deshalb überprüfe ich die Berechnungen beim Debuggen des Codes lieber noch einmal in Excel, als später falsche Schlüsse zu ziehen.

 
Vladimir:

Was haben Sie aus der Dokumentation über den dritten Parameter gelernt, der für diesen Fall nützlich ist, wenn es darum geht, .csvs, die in verschiedenen Programmen erstellt wurden und eine beliebige Größe haben, in den Speicher zu heben?

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 erhöht als eine binäre Suche...

Kostenloser Unterricht für Anfänger:

Der dritte Parameter ArrayResize gibt die tatsächliche Größe des Arrays an, ein Vielfaches dieser Zahl.

ArrayResize(arr, 5, 1000) - nimmt 1000 Elemente im Speicher auf.

ArrayResize(arr, 1005, 1000) - nimmt 2000 Elemente im Speicher auf.

Aus diesem Grund gibt es keine permanente Speicherzuweisung.

 
Aleksey Vyazmikin:

Das Thema wurde zum Zeitpunkt des Auftretens des Problems formuliert, als es noch keine endgültigen Erkenntnisse über die Ursachen gab. Ich bin davon ausgegangen, dass ich eine Klasse habe, die mit Hilfe eines MQ-Mitarbeiters erstellt wurde, so dass ich keinen Grund hatte, an ihrer korrekten Funktionsweise zu zweifeln.

Wenn das Programm die Daten nicht korrekt und effizient speichert, können Sie mir dann sagen, wie ich sie korrekt und effizient speichern kann? Was sollte ich in der Klasse ändern, damit sie weniger Speicher verbraucht?

Generell wäre es sehr schön, wenn das Terminal mit einer solchen Klasse ausgeliefert würde, um mit CSV-Tabellen zu arbeiten.

Das Problem liegt nicht in der Klasse, sondern in der Verwendung dieser Klasse.

Tatsächlich ist das Lesen von CSV bereits auf FileOpen-Ebene mit dem Flag FILE_CSV implementiert.

Dafür brauchen Sie keine eigene Klasse.

 
Roffild:

Eine kostenlose Lektion für Anfänger:

Der dritte Parameter ArrayResize setzt die tatsächliche Größe des Arrays auf ein Vielfaches dieser Zahl.

ArrayResize(arr, 5, 1000) - nimmt 1000 Elemente im Speicher auf.

ArrayResize(arr, 1005, 1000) - wird den Speicher von 2000 Elementen belegen.

Aus diesem Grund gibt es keine permanente Speicherzuweisung.

Vladimir hat es im Gegensatz zu Ihnen geschafft, den Code zu analysieren und einen Weg zu finden, ihn zu beschleunigen. Und Sie positionieren sich hier als Theoretiker, der mit dem Code eines anderen nicht umgehen kann. All diese Schlussfolgerungen - was bringen sie Ihnen, vielleicht können Sie zeigen, dass das Hinzufügen zusätzlicher Parameter den Code beschleunigt oder den Speicherverbrauch verringert?


Roffild:

Das Problem liegt nicht in der Klasse, sondern darin, wie die Klasse genutzt wird.

Tatsächlich ist das Lesen von CSV bereits auf FileOpen-Ebene mit dem Flag FILE_CSV implementiert.

Dafür brauchen Sie keine eigene Klasse.

Wenn Sie nicht verstehen, wozu das gut sein soll, warum treffen Sie dann Entscheidungen für andere? Ich will damit sagen, dass man es den Leuten bequem machen muss, dafür sind die Klassen ja da.

 
Aleksey Vyazmikin:

Im Gegensatz zu Ihnen war Vladimir in der Lage, den Code zu analysieren und einen Weg zu finden, ihn zu beschleunigen. Und Sie positionieren sich hier als Theoretiker, der nicht mit dem Code anderer Leute arbeiten kann. All diese Schlussfolgerungen - was bringen sie Ihnen, vielleicht können Sie zeigen, dass das Hinzufügen zusätzlicher Parameter die Arbeit beschleunigt oder den Speicherverbrauch verringert?

Tatsächlich konnte Vladimir die Klasse nicht schneller machen, indem er sie bearbeitete. Die Klasse wurde von einem "MQ-Mitarbeiter" erstellt und ein Benutzer, der die Dokumentation nicht gelesen hat, hat es geschafft, die Klasse zu verbessern?

Aleksey Vyazmikin:

Wenn Sie nicht verstehen, wozu das gut sein soll, warum entscheiden Sie dann für andere? Ich bin der Meinung, dass man es den Leuten bequem machen muss, dafür sind Klassen ja da.

Müssen Sie also Standardfunktionen in Klassen verpacken, um sie zu verwenden?

Vielleicht sollten Sie die Dokumentation zu FILE_CSV lesen, anstatt eine ganz eigene Klasse zu verwenden?

Es wurden hier bereits andere fertige Lösungen gepostet, die jedoch ignoriert wurden.

Meine Lösung für das Schreiben in CSV ohne Begrenzung der Spaltenanzahl befindet sich in meiner Bibliothek. Sogar die Grundsätze der OOP (ich glaube nicht, dass Sie mit dieser Programmiermethode vertraut sind) werden beachtet. Aber ich werde es nicht empfehlen.

Es ist unwahrscheinlich, dass die richtige Lösung hier kostenlos zu finden ist...

 
Roffild:

Eigentlich gibt es keine Möglichkeit, dass Vladimir die Klasse mit seinen Bearbeitungen beschleunigt hätte. Die Klasse wurde von einem "MQ-Mitarbeiter" erstellt und der Benutzer, der die Dokumentation nicht gelesen hat, hat es geschafft, die Klasse zu verbessern?

Haben Sie geprüft und keine Beschleunigung festgestellt? Oder wollen Sie sagen, dass ich alle hier in die Irre führe?

Roffild:

Um Standardfunktionen zu verwenden, müssen Sie sie also in Klassen verpacken?

Vielleicht sollten Sie die Dokumentation zu FILE_CSV lesen, anstatt eine ganz eigene Klasse zu verwenden?

Es wurden hier bereits andere fertige Lösungen gepostet, die jedoch ignoriert wurden.

Meine Lösung für das Schreiben in CSV ohne Begrenzung der Spaltenanzahl befindet sich in meiner Bibliothek. Sogar die Grundsätze der OOP (ich glaube nicht, dass Sie mit dieser Programmiermethode vertraut sind) werden beachtet. Aber ich werde es nicht empfehlen.

Es ist unwahrscheinlich, dass es hier eine kostenlose Lösung gibt...

Haben Sie diesen Thread aufmerksam gelesen? Haben Sie meine Antwort auf die fertige Lösung in Form einer Funktion gesehen? Haben Sie eine andere Lösung? Ich weiß natürlich nicht, was OOP ist, ein aufmerksamer Leser dieses Threads hätte es sofort bemerkt...

Über Rentabilität/kostenlos - das ist lächerlich, ich habe nur gezeigt, dass bezahlte Lösungen eine Lösung nicht besser machen als eine kostenlose, während Sie wieder über Geld reden...