Voracité de la mémoire RAM de MT5, problèmes de lecture/écriture de gros fichiers - page 7

 
Il s'avère que mon terminal sans le script consomme 820 mégaoctets, donc le binaire consomme 180 mégaoctets, ce qui est apparemment correct, étant donné les deux tableaux remplis.
 
Le sujet n'est pas tout à fait correctement formulé.

La mémoire n'est pas consommée par le terminal, mais par un programme spécifique avec une implémentation spécifique. Dans ce cas, le programme MQL stocke les données de manière incorrecte et inefficace.
 
Aleksey Vyazmikin:

Pouvez-vous me dire ce qu'il faut réparer ?

C'est normal que vous lisiez le tableau en premier, mais après l'avoir lu, vous devez fermer le fichier.

et ensuite écrire de la même façon, pas par l'intermédiaire de votre bibliothèque.

 
Renat Fatkhullin:
Le sujet n'est pas tout à fait correctement formulé.

La mémoire n'est pas consommée par le terminal, mais par un programme spécifique avec une implémentation spécifique. Dans ce cas, le programme MQL stocke les données de manière incorrecte et inefficace.

Le sujet a été formulé au moment où le problème est apparu, alors qu'il n'y avait pas de compréhension définitive des causes. Je suis parti du fait que j'ai une classe qui a été créée avec la participation d'un employé de MQ, ce qui signifie que je n'avais aucune raison de douter de son exactitude.

Si le programme ne stocke pas les données correctement et efficacement, pouvez-vous me dire comment les stocker correctement et efficacement ? Que dois-je changer dans la classe pour qu'elle consomme moins de mémoire ?

En général, il serait très bien si le terminal était livré avec une classe similaire pour travailler avec des tableaux basés sur CSV.

 
Maxim Dmitrievsky:

Il est possible de lire le tableau en premier, mais après avoir lu le fichier, il faut le fermer.

et écrire de la même façon, pas par l'intermédiaire de votre bibliothèque.

Je vais la fermer, merci.

Je dois écrire en deux variantes, car le format CSV m'aide à voir réellement ce qui se passe dans les tableaux - hélas, je fais des erreurs et je préfère donc revérifier les calculs dans excel lors du débogage du code, plutôt que de tirer des conclusions erronées plus tard.

 
Vladimir:

Qu'avez-vous appris de la documentation à propos du troisième paramètre qui est utile dans ce cas, pour résoudre le problème de la mise en mémoire de .csv créés dans différents programmes et ayant une taille arbitraire ?

N'hésitez pas à suggérer une meilleure modification, non binaire, qui augmente la vitesse de réallocation de la mémoire (en réduisant le nombre d'appels ArrayResize) plus qu'une recherche binaire...

Leçon gratuite pour les débutants :

Le troisième paramètre ArrayResize spécifie la taille réelle du tableau, un multiple de ce nombre.

ArrayResize(arr, 5, 1000) - prendra 1000 éléments en mémoire.

ArrayResize(arr, 1005, 1000) - occupera 2000 éléments en mémoire.

C'est pourquoi il n'y a pas d'allocation permanente de mémoire.

 
Aleksey Vyazmikin:

Le sujet a été formulé au moment où le problème est apparu, alors qu'il n'y avait pas de compréhension définitive des causes. Je partais du principe que j'avais une classe qui avait été créée avec l'aide d'un employé MQ, ce qui signifie que je n'avais aucune raison de douter de son bon fonctionnement.

Si le programme ne stocke pas les données correctement et efficacement, pouvez-vous me dire comment les stocker correctement et efficacement ? Que dois-je changer dans la classe pour qu'elle consomme moins de mémoire ?

En général, il serait très bien si le terminal était livré avec une telle classe pour travailler avec des tableaux basés sur CSV.

Le problème n'est pas dans la classe, mais dans l'utilisation de cette classe.

En fait, la lecture de CSV est déjà implémentée au niveau de FileOpen avec l'indicateur FILE_CSV.

Vous n'avez pas besoin d'une classe séparée pour ça.

 
Roffild:

Une leçon gratuite pour les débutants :

Le troisième paramètre ArrayResize fixe la taille réelle du tableau à un multiple de ce nombre.

ArrayResize(arr, 5, 1000) - occupera 1000 éléments en mémoire.

ArrayResize(arr, 1005, 1000) - occupera la mémoire de 2000 éléments.

C'est pourquoi il n'y a pas d'allocation permanente de mémoire.

Vladimir, contrairement à vous, a réussi à analyser le code et à trouver un moyen de l'accélérer. Et vous vous positionnez ici comme un théoricien qui ne peut pas traiter le code de quelqu'un d'autre. Toutes ces conclusions - que vous apportent-elles, peut-être pouvez-vous montrer que l'ajout de paramètres supplémentaires accélérera le travail ou réduira la consommation de mémoire ?


Roffild:

Le problème n'est pas dans la classe, mais dans la façon dont la classe est utilisée.

En fait, la lecture de CSV est déjà implémentée au niveau de FileOpen avec l'indicateur FILE_CSV.

Vous n'avez pas besoin d'une classe séparée pour ça.

Si vous ne comprenez pas à quoi il sert, pourquoi prenez-vous des décisions pour les autres ? Je dis que vous devez rendre les choses pratiques pour les gens, c'est pour cela que les cours sont écrits.

 
Aleksey Vyazmikin:

Vladimir, contrairement à vous, a pu analyser le code et trouver un moyen de l'accélérer. Et vous vous positionnez ici comme un théoricien qui ne peut pas travailler avec le code d'autres personnes. Toutes ces conclusions - que vous apportent-elles, peut-être pouvez-vous montrer que l'ajout de paramètres supplémentaires accélérera le travail ou réduira la consommation de mémoire ?

En fait, Vladimir n'a pas pu rendre le cours plus rapide en l'éditant. La classe a été créée par un "employé MQ" et un utilisateur qui n'a pas lu la documentation a réussi à améliorer la classe ?

Aleksey Vyazmikin:

Si vous ne comprenez pas à quoi ça sert, pourquoi décidez-vous pour les autres ? Je dis qu'il faut rendre les choses pratiques pour les gens, c'est pour cela que les cours sont écrits.

Pour utiliser les fonctions standard, il faut donc les envelopper dans des classes ?

Peut-être devriez-vous lire la documentation sur FILE_CSV, au lieu d'utiliser une classe à part entière ?

D'autres solutions toutes faites ont déjà été postées ici et ont été ignorées.

Ma solution pour écrire en CSV sans limite de nombre de colonnes se trouve dans ma bibliothèque. Même les principes de la POO (je ne pense pas que vous soyez familier avec cette méthode de programmation) sont respectés. Mais je ne le recommanderai pas.

Il est peu probable que la bonne solution apparaisse ici gratuitement...

 
Roffild:

En fait, il est impossible que Vladimir ait pu accélérer le cours avec ses modifications. La classe a été créée par un "employé MQ" et l'utilisateur, qui n'a pas lu la documentation, a réussi à améliorer la classe ?

Avez-vous vérifié et aucune accélération n'a été détectée ? Ou êtes-vous en train de dire que j'induis tout le monde en erreur ici ?

Roffild:

Pour utiliser les fonctions standard, il faut donc les intégrer dans des classes ?

Peut-être devriez-vous lire la documentation sur FILE_CSV au lieu d'utiliser une classe entièrement séparée ?

D'autres solutions toutes faites ont déjà été postées ici et ont été ignorées.

Ma solution pour écrire en CSV sans limite de nombre de colonnes se trouve dans ma bibliothèque. Même les principes de la POO (je ne pense pas que vous soyez familier avec cette méthode de programmation) sont respectés. Mais je ne le recommanderai pas.

Il est peu probable qu'une solution gratuite apparaisse ici...

Lisez-vous attentivement ce fil de discussion ? Avez-vous vu ma réponse à la solution toute faite sous forme de fonction ? Avez-vous une autre solution ? Bien sûr, je ne sais pas ce qu'est OOP, un lecteur attentif de ce fil l'aurait remarqué tout de suite...

À propos de la rentabilité/gratuité - c'est ridicule, je montrais juste que les solutions payantes ne sont pas meilleures que les solutions gratuites, alors que vous parlez encore d'argent...