MT5 RAMメモリの容量不足、大容量ファイルの読み書きに問題がある。 - ページ 7

 
スクリプトなしの私のターミナルは820メガバイトを消費し、バイナリは180メガバイトを消費していることが判明しました。
 
このトピックは、ちょっと正しい表現ではありませんね。

端末がメモリを食うのではなく、特定の実装をした特定のプログラムがメモリを食うのである。この場合、MQLプログラムはデータを誤って非効率的に保存していることになります。
 
Aleksey Vyazmikin:

その中で、何を直せばいいのか教えてください。

まあ、それはいいとして、最初に配列を読むのですが、読んだ後はファイルを閉じなければなりません。

を、ライブラリ経由ではなく、同じように書き込んでください。

 
Renat Fatkhullin:
このテーマは、なかなか正しく定式化されていない。

メモリは端末が食い尽くすのではなく、特定の実装の特定のプログラムが食い尽くす。この場合、MQLプログラムはデータを誤って非効率的に保存していることになります。

このテーマは、原因が最終的に解明されていない問題が発生した時点で策定されました。MQの社員が関わって作ったクラスがある、つまりその正しさを疑う理由がない、というところから話を進めました。

プログラムが正しく効率的にデータを保存していない場合、正しく効率的にデータを保存する方法を教えてください。メモリ消費を少なくするためには、クラスのどこを変更すればよいのでしょうか?

一般的に、CSVベースのテーブルを操作するための同様のクラスを備えた端末が提供されれば、非常にありがたいのですが。

 
Maxim Dmitrievsky:

最初に配列を読み込むのは良いのですが、読み込んだ後、ファイルを閉じる必要があります

と書き、図書館を通さず、同じように書く。

閉じます、ありがとうございました。

CSV形式だと、配列の中で何が起こっているのかがよくわかるので、2つの形式で書かなければなりません。

 
Vladimir:

異なるプログラムで作成され、任意のサイズを持つ.csvをメモリに読み込む問題を解決するために、このケースで有用な第3パラメータについて、ドキュメントから何を学びましたか?

バイナリサーチよりもメモリ再配置の速度を上げる(ArrayResizeの呼び出し 回数を減らす)、より良い、バイナリでない変更を自由に提案してください...。

初心者のための無料レッスンです。

第3パラメータArrayResizeは、配列の実際のサイズを指定し、その数値の倍数である。

ArrayResize(arr, 5, 1000) - メモリ内に1000個の要素を取り込みます。

ArrayResize(arr, 1005, 1000) - メモリに2000個の要素を取り込みます。

そのため、永久にメモリが確保されることはありません。

 
Aleksey Vyazmikin:

このテーマは、問題が発生した当時、原因について明確な理解が得られていない段階で策定されました。私の想定では、MQの社員からの入力で作成されたクラスがあり、つまり正しく動作していると信じて疑わなかったのです。

プログラムが正しく効率的にデータを保存していない場合、正しく効率的にデータを保存する方法を教えてください。メモリ消費を少なくするためには、クラスのどこを変更すればよいのでしょうか?

一般に、CSVベースのテーブルを操作するために、このようなクラスがターミナルに提供されると非常に良いと思います。

問題はクラスにあるのではなく、このクラスを使うことにあるのです。

実は、CSV からの読み込みは、FileOpen レベルでFILE_CSV というフラグで既に実装されています。

そのために別のクラスが必要なわけではありません。

 
Roffild:

初心者のための無料レッスンです。

3番目のパラメータArrayResizeは、配列の実際のサイズをこの数値の倍数に設定します。

ArrayResize(arr, 5, 1000) - メモリ内に1000個の要素を取り込みます。

ArrayResize(arr, 1005, 1000) - 2000要素分のメモリを占有します。

そのため、永久にメモリが確保されることはありません。

ウラジミールは、あなたと違って、コードを解析して高速化する方法を見つけることができたのです。そして、あなたはここで、他人のコードを扱うことができない理論家として、自分を位置づけているのです。これらの結論は、何をもたらすのでしょうか。もしかしたら、パラメータを追加することでコードが高速化されたり、メモリ消費量が減ったりすることを示せるかもしれません。


ロフィルド

問題はクラスにあるのではなく、クラスの使い方にあるのです。

実は、CSV からの読み込みは、FileOpen レベルでFILE_CSV というフラグで既に実装されています。

そのために別のクラスが必要なわけではありません。

何のためにあるのか理解できないなら、なぜ他人のために決断するのか?そのために授業があるのだから、人のために便利なものを作れと言っているのです。

 
Aleksey Vyazmikin:

ウラジミールは、あなたと違って、コードを解析して高速化する方法を見つけることができたのです。そして、あなたはここで、他人のコードを扱うことができない理論家として自分を位置づけているのです。これらの結論は、何をもたらすのでしょうか。もしかしたら、パラメータを追加することで作業が速くなったり、メモリ消費量が減ったりすることを示せるかもしれません。

実はウラジミールも、編集で授業を速くすることはできなかったんです。クラスは「MQの社員」が作ったもので、ドキュメントを読まないユーザーが何とか改良したのでは?

アレクセイ・ヴャジミキン

何のためにあるのか理解できないのに、なぜ他人のために決めるのか?私は、人のために便利にしなければならない、そのために授業が書かれているのだと言っています。

では、標準的な関数を使うには、クラスでくくる必要があるのでしょうか?

FILE_CSVの ドキュメントを読むべきかもしれません。

すでにここには、他の既成の解決策が投稿されていますが、無視されています。

列数の制限なくCSVに書き込むための私の解決策は、私のライブラリにあります。OOPの原則(このプログラミング手法には馴染みがないと思いますが)さえも尊重されています。しかし、私はそれを勧めません。

ここに正しい解答が無料で現れるとは思えませんが...。

 
Roffild:

実際、ウラジミールの編集で授業が加速されることはあり得なかったのです。クラスは「MQの社員」が作ったもので、ドキュメントを読んでいないユーザーが何とか改良したのでは?

確認したところ、加速度は検出されなかったのでしょうか?それとも、私がここで皆さんに誤解を与えているとおっしゃるのですか?

ロフィルド

では、標準的な関数を使うには、クラスにラップする必要があるのでしょうか?

FILE_CSVの ドキュメントを読んで、別のクラスを使用する必要があるかもしれません。

すでにここには、他の既成の解決策が投稿されていますが、無視されています。

列数の制限なくCSVに書き込むための私の解決策は、私のライブラリにあります。OOPの原則(このプログラミング手法には馴染みがないと思いますが)さえも尊重されています。しかし、私はそれを勧めません。

自由な解決策は、ここには現れそうにない...。

このスレッドよく読んでるか?関数の形で解答を用意した私の答えは見ていただけたでしょうか?他の解決策はないのでしょうか?もちろん、OOPが何であるかは知りません、このスレッドを注意深く読んでいる人ならすぐに気がついたでしょう...。

収益性/無料について - それはおかしい。私は、有料のソリューションが無料のソリューションより優れているわけではないことを示しただけなのに、あなたはまたお金の話をしている......。