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

 
Vladislav Andruschenko:


以前、この問題にぶつかったことがあります。修正もたくさんしました。全部は覚えていませんが......一度きりの仕事でした。

が、ArrayResize(arrRead_01,arrSize); を第3パラメータに設定してみてください。


intreserve_size=0// リザーブサイズ値(超過分).


と実験する。

ありがとうございます。しかし、私の実験から判断すると、すべてのラグとメモリ消費は、ファイルから情報を読み取るクラスで発生しています。もしかしたら、そこで何かが調整できるかもしれません。

 
また、2つ目の質問である録画制限について、どなたか解決された方がいらっしゃいましたら教えてください。
 

メモリの再配置速度から判断して、文字列の配列はオブジェクトの配列として格納され、ポインタではないため、ブレーキがかかるのです。開発者にこの問題を明らかにしてもらわないと、解決は難しい。

そして、パーサーは文字列からセルのローカル配列を作成し、それを割り当てられたメモリに コピーするのですが、これは不必要な松葉杖であり、しかも重要なものです。

オブジェクトの配列としてなら、問題のセルの更新頻度や数にもよりますが、読み込み時にファイルをパースせず、xw-fileをファイル行の配列として保存し、その場でデータを更新する(つまり、セルへのアクセスのたびに文字列をパースする)方が、おそらく時間的に安上がりでしょう。いずれにせよ、パーサーは書き直す必要があり、非常に非効率的で、引用符で囲まれたセルをサポートしておらず、数値テーブルのインポートにのみ適しています。

 
SeriousRacoon:

メモリの再配置速度から判断して、文字列の配列はオブジェクトの配列として格納され、ポインタではないため、ブレーキがかかるのです。この問題を明確にするために開発者が必要であり、解決策はそれにかかっています。

開発者に電話してみよう、@Renat Fatkhullin- 状況を明確にできますか?

SeriousRacoon

そして、パーサーは文字列からセルのローカル配列を作成し、それを割り当てられたメモリに コピーします。これは不必要な松葉杖であり、しかも重要なものです。

どうすればいいのだろう?

SeriousRacoon

オブジェクトの配列としてなら、問題のセルの更新頻度や回数にもよるが、おそらく、読み込み時にファイルをパースせず、xw-fileをファイル行の配列として格納し、その場でデータを更新する(つまり、セルへのアクセス毎に文字列をパースする)方が時間的に安上がりだろう。いずれにせよ、パーサーは書き直す必要があります。極めて非効率的で、引用符で囲まれたセルには対応しておらず、数値テーブルをインポートするのに適しているだけです。

"ファイル行の配列" - どういう意味ですか?もし、すべての文字列を格納する配列を作成するだけなら、私の理解する限り、文字列の長さには文字数の制限があるのではないでしょうか?

読書教室はMQの社員が書いたもので、そこそこ知的に書かれていると思ったのですが。

パーサーはテキストを正しく読みます。ここでは同意できませんが、以前添付したスクリプトで確認しています。

 
Aleksey Vyazmikin:

開発者に電話してみよう!@Renat Fatkhullin- 状況を明確にしてもらえますか?

どうすればいいのでしょうか?

"ファイル文字列の配列" - どういう意味ですか?もし、すべての文字列を書き込む配列を作るだけの問題なら、私の理解する限り、文字列の長さには文字数の制限があるのではないでしょうか?

読書教室はMQの社員が書いたもので、そこそこ知的に書かれていると思ったのですが。

パーサーがテキストを正しく読み取ること、私はそうは思いません。以前添付したスクリプトで確認しました。

引用符で囲まれた文字列がなく、その中にデリミタ文字があるファイルを正しく読み取ることができます。60;""サンプル;ストリング""を読み込んでみてください。出力には、[60]と[sample;string]の2つのセルが含まれるはずです。おそらく、3 - [60] ["sample;string"] と表示されるでしょう。(HH その上、qusv ではハイフンを使った文字列が可能です :) )

Cやプラスでこれを取り除く方法は知っています。最初に文字列ポインタの配列を割り当てて、文字列をパースしてそれを埋めるのです。mclにはポインタがないので、この作業にどうアプローチすればいいのかわからない。Renatが明らかにしてくれることを期待します。

"ファイル文字列の配列" - どういう意味ですか?すべての文字列を格納する配列を作成するだけなら、私の理解する限り、文字列の長さには文字数制限がありますよね?

つまり、ファイルを一行ずつ読んで、パースせずにファイルの元の行をそれぞれ配列に格納するのです。文字列をフォーマット(row, column)でアクセスする場合、文字列rowを受け取り、その場でパースしてcolumnの値を与え、パース結果を同時にキャッシュします。

 

ここで、もうひとつの解決策を考えてみましょう。ファイルを読み込む際、パージングを行います。各行に2つの整数値からなる配列を保存します:行内のセルの値を開始する文字のインデックスと、その部分文字列の長さです。

例えば、こんな感じです。

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

ここにインデックスと長さの値があり、さらにオンデマンドで解析するために保存します。
 
SeriousRacoon:

区切り文字を含む引用符で囲まれた文字列がないファイルを正しく読み取ることができます。60;""サンプル;文字列""をこれで読んでみてください。出力は、[60]と[sample;string]の2つのセルになるはずです。おそらく、3 - [60] ["sample;string"] が得られるでしょう。(HH その上、qusv ではハイフンを使った文字列が可能です :) )

なるほど、CSVの規格にそんな微妙なところがあったとは知りませんでした。クセを啓発していただき、ありがとうございます

SeriousRacoon

C言語やプラスティックでこれを取り除く方法は知っています。最初に文字列ポインタの配列を割り当てて、文字列を解析しながらそれを埋めていくのです。mclにはポインタがないので、この作業にどうアプローチすればいいのかわからない。Renatが明らかにしてくれることを期待します。

Renatが明らかにしてくれることを期待します。

SeriousRacoon

つまり、ファイルを一行ずつ読んで、パースせずにファイルの元の行をそれぞれ配列に格納するのです。format (row, column) で文字列にアクセスする場合、文字列 row を受け取り、その場でパースして column の値を返し、パース結果をキャッシュする。

そうですね、キャッシュだって特に必要ない、時間的に最適なんだろうなと思います。この方法を実行するために、クラスを支援し、適切な編集をすることができますか?

 
SeriousRacoon:

ここで、もうひとつの解決策を考えてみましょう。ファイルを読み込む際、パージングを行います。各行に2つの整数値からなる配列を保存します:行内のセルの値を開始する文字のインデックスと、その部分文字列の長さです。

例えば、こんな感じです。

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

ここにインデックスと長さの値があり、さらにオンデマンドでパースするために保存しています。

そうそう、今日上に書いたような、何が何だか先に計算して、それから配列を埋めて いく、そんなやり方です。しかし、どのように実装すればいいのか全く分からない :(

 

WriteArray / Readは高速で、最大サイズは300mbまで、すべてが非常に高速で、RAMを消費しない。

なぜ読み書きのコードがこんなに多いのか、4行で完結しているのに......。

 
Maxim Dmitrievsky:

WriteArray / Readは高速で、最大サイズは300mbまで、すべてが非常に高速で、RAMを消費しない。

なぜ読み書きのコードがこんなに多いのか、4行で完結しているのに......。

について