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

 
Vladislav Andruschenko:


Dieses Problem ist mir schon einmal begegnet. Ich habe eine Menge Korrekturen vorgenommen. Ich erinnere mich nicht mehr an alles - es war eine einmalige Aufgabe,

aber versuchen Sie,ArrayResize(arrRead_01,arrSize) zu setzen; der dritte Parameter hier


intreserve_size=0// Wert der Reservegröße (Überschuss )


und experimentieren.

Danke, aber alle Verzögerungen und der Speicherverbrauch treten, nach meinen Experimenten zu urteilen, in der Klasse für das Lesen von Informationen aus der Datei auf. Vielleicht kann dort etwas behoben werden?

 
Auch bei der zweiten Frage - der Aufzeichnungsbeschränkung - würde ich gerne helfen. Hat jemand dieses Problem gelöst?
 

Nach der Geschwindigkeit der Speicher-Neuzuweisung zu urteilen, werden Arrays von Strings als Arrays von Objekten gespeichert, nicht als Zeiger auf sie, daher die Bremsen. Wir brauchen die Entwickler, um dieses Problem zu klären, denn die Lösung hängt davon ab.

Dann erstellt der Parser ein lokales Array von Zellen aus der Zeichenkette und kopiert sie dann in den zugewiesenen Speicher, was eine unnötige Krücke ist, und zwar eine erhebliche.

Wenn als ein Array von Objekten - dann, je nach Häufigkeit und Anzahl der Aktualisierungen von Zellen in das Problem, wahrscheinlich wäre billiger in der Zeit nicht zu parsen die Datei beim Laden, und zu speichern xw-Datei als ein Array von Datei-Zeilen und Daten zu aktualisieren on the fly (dh, parsen die Zeichenfolge bei jedem Zugriff auf die Zelle). In jedem Fall muss der Parser neu geschrieben werden, da er extrem ineffizient ist, keine Anführungszeichen unterstützt und nur für den Import numerischer Tabellen geeignet ist.

 
SeriousRacoon:

Nach der Geschwindigkeit der Speicher-Neuzuweisung zu urteilen, werden Arrays von Strings als Arrays von Objekten gespeichert, nicht als Zeiger auf sie, daher die Bremsen. Wir brauchen Entwickler, um diese Frage zu klären, denn die Lösung hängt davon ab.

Versuchen wir, den Entwickler anzurufen,@Renat Fatkhullin- können Sie die Situation klären?

SeriousRacoon:

Dann erstellt der Parser ein lokales Array von Zellen aus einer Zeichenkette und kopiert sie dann in den zugewiesenen Speicher - eine unnötige Krücke, und zwar eine erhebliche.

Wie können wir sie loswerden?

SeriousRacoon:

Wenn es sich um Arrays von Objekten handelt, wäre es je nach Häufigkeit und Anzahl der Aktualisierungen von Zellen im Problem wahrscheinlich zeitsparender, die Datei beim Laden nicht zu parsen und xw-file als Array von Dateizeilen zu speichern und die Daten im laufenden Betrieb zu aktualisieren (d. h. die Zeichenkette bei jedem Zugriff auf die Zelle zu parsen). Der Parser muss auf jeden Fall umgeschrieben werden, er ist extrem ineffizient, unterstützt keine Anführungszeichen und eignet sich nur für den Import numerischer Tabellen.

"Array of file lines" - was meinen Sie damit? Wenn es nur über die Erstellung eines Arrays, um alle Zeichenfolgen zu halten, dann so weit ich verstehe, die Zeichenfolge Länge hat eine Zeichengrenze, nicht?

Die Lesestunde wurde von einem MQ-Mitarbeiter geschrieben, ich fand das alles sehr intelligent geschrieben.

Der Parser liest den Text korrekt, ich stimme hier nicht mit Ihnen überein - das zuvor angehängte Skript bestätigt dies.

 
Aleksey Vyazmikin:

Versuchen wir, den Entwickler anzurufen,@Renat Fatkhullin- können Sie die Situation klären?

Wie kann man sie loswerden?

"Array of file strings" - was meinen Sie? Wenn es nur über die Erstellung eines Arrays, wo alle Zeichenfolgen geschrieben werden, dann so weit wie ich verstehe, die Zeichenfolge Länge hat Beschränkungen für die Anzahl der Zeichen, nicht?

Die Lesestunde wurde von einem MQ-Mitarbeiter geschrieben, ich fand das alles sehr intelligent geschrieben.

Parser korrekt liest Text, ich bin nicht einverstanden mit Ihnen - das Skript zuvor beigefügt bestätigt es.

Es liest Dateien, die keine Anführungszeichen enthalten und in denen ein Trennzeichen vorhanden ist, korrekt. Versuchen Sie, 60;""sample;string""" daraus zu lesen. Die Ausgabe sollte 2 Zellen enthalten: [60] und [sample;string]. Sie werden wahrscheinlich 3 - [60] ["sample;string"] erhalten. (HH außerdem erlaubt qusv Zeichenketten mit Bindestrichen :) )

Ich weiß, wie ich dies in C oder Plus loswerden würde - weisen Sie ein Array von String-Zeigern zuerst und füllen Sie es durch Parsen der Zeichenfolge. In mcl gibt es keine Zeiger, ich verstehe nicht, wie ich diese Aufgabe angehen soll. Hoffentlich kann Renat das klären.

"Ein Array von Dateistrings" - was meinen Sie damit? Wenn es nur über die Erstellung eines Arrays, die alle Zeichenfolgen enthalten wird, dann so weit ich verstehe, die Zeichenfolge Länge hat eine Zeichengrenze, nicht?

Ich meine, die Datei Zeile für Zeile zu lesen und jede Originalzeile der Datei in einem Array zu speichern, ohne sie zu parsen. Beim Zugriff auf eine Zeichenkette durch das Format (Zeile, Spalte) wird die Zeichenkette Zeile genommen, on the fly geparst und der Spaltenwert angegeben, wobei das Parsing-Ergebnis gleichzeitig zwischengespeichert wird.

 

Hier ist eine weitere mögliche Lösung. Wenn Sie eine Datei lesen, führen Sie ein Parsing durch - speichern Sie für jede Zeile ein Array mit zwei ganzzahligen Werten: den Index des Zeichens, mit dem der Wert der Zelle in der Zeile beginnt, und die Länge dieser Teilfolge.

Zum Beispiel:

строка в файле : 54;345;12;12345
индекс символа : 0  3   7  10
длина подстроки: 2  3   2  5

Hier sind die Werte der Indizes und Längen und speichern sie für die weitere Analyse bei Bedarf.
 
SeriousRacoon:

Es liest Dateien korrekt, in denen keine Zeichenfolgen in Anführungszeichen mit einem Begrenzungszeichen enthalten sind. Versuchen Sie, 60;""sample;string"" damit zu lesen. Die Ausgabe sollte aus 2 Zellen bestehen: [60] und [sample;string]. Sie werden wahrscheinlich 3 - [60] ["sample;string"] erhalten. (HH außerdem erlaubt qusv Zeichenketten mit Bindestrichen :) )

Oh, ich verstehe, ich wusste nichts von solchen Feinheiten des CSV-Standards. Danke, dass Sie mich über die Besonderheiten aufgeklärt haben!

SeriousRacoon:

Ich weiß, wie ich es in C oder Plus loswerden würde - ich würde ein Array von String-Zeigern zuerst zuweisen und füllen Sie es in, die Zeichenfolge zu parsen. In mcl gibt es keine Zeiger, ich verstehe nicht, wie ich diese Aufgabe angehen soll. Hoffentlich kann Renat das klären.

Hoffentlich kann Renat das klären.

SeriousRacoon:

Ich meine, die Datei Zeile für Zeile zu lesen und jede Originalzeile der Datei in einem Array zu speichern, ohne sie zu parsen. Beim Zugriff auf die Zeichenkette durch das Format (Zeile, Spalte) wird die Zeichenkette Zeile genommen, im laufenden Betrieb geparst und der Wert der Spalte zurückgegeben, wobei das Ergebnis des Parsings zwischengespeichert wird.

Ja, ich denke, es wäre optimal in der Zeit, auch der Cache ist nicht wirklich erforderlich, denke ich. Können Sie bei der Umsetzung dieses Ansatzes helfen und entsprechende Änderungen an der Klasse vornehmen?

 
SeriousRacoon:

Hier ist eine weitere mögliche Lösung. Wenn Sie eine Datei lesen, führen Sie ein Parsing durch - speichern Sie für jede Zeile ein Array mit zwei ganzzahligen Werten: den Index des Zeichens, mit dem der Wert der Zelle in der Zeile beginnt, und die Länge dieser Teilfolge.

Zum Beispiel:

строка в файле : 54;345;12;12345
индекс символа : 0  3   7  10
длина подстроки: 2  3   2  5

Hier werden die Werte für Index und Länge gespeichert, um sie bei Bedarf weiter zu analysieren.

Nun ja, das ist in etwa der Ansatz, über den ich oben geschrieben habe - erst berechnen, was was ist, und dann das Feld ausfüllen. Aber ich habe keine Ahnung, wie ich das umsetzen soll :(

 

WriteArray / Read sind schnell, max Größe bis zu 300 mb, alles ist sehr schnell, nicht verbrauchen RAM

Warum gibt es so viel Code zum Lesen/Schreiben, es ist alles in 4 Zeilen erledigt

 
Maxim Dmitrievsky:

WriteArray / Read sind schnell, max Größe bis zu 300 mb, alles ist sehr schnell, nicht verbrauchen RAM

Warum gibt es so viel Code zum Lesen/Schreiben, es ist alles in 4 Zeilen erledigt

Über
Grund der Beschwerde: