質問
2020年6月30日火曜日 11:59
Microsoft Edge でエラーコード Out of Memory
マイクロソフト コミュニティのMicrosoft Edge
に同トピックで投稿していたのですが、
助言を頂きこちらへの投稿です。
(1)トラブル:更新後のEdgeの計算容量の減少
本ブラウザ上で以前出来ていた当方の技術計算が
ブラウザから Out of Memory が出て停止。
(2)Edge
バージョン 81.0.416.81 (64 ビット)
(3)当方のパソコン
64ビット、Windows 10 Home, 1903 (OSビルド 18362.900)
(4)状況詳細:有限要素法で行列計算
以前は 16562x16562 (合計2億7千万個)迄ok
現在は 5202x 5202 (合計2千7百万個)が限界
なお、他社ブラウザ Firefox は以前のEdgeのを維持。
JavaScript計算容量に関し、以前のEdgeにしたい。
すべての返信 (11)
2020年7月4日土曜日 0:23 ✅回答済み
総メモリ使用可能量はオプションで増やせます。64bitなので、搭載メモリ+スワップは確保できるようになるでしょう。
node.jsだと、次のように指定します(単位はMB)。node --max-old-space-size=8000
その制約とは別に、V8には1つのObject(FixedArrayとか)のサイズが1GB(kMaxSize )を超えられない、という制約もあります。なのでそういう意味では、オプションを付けて総メモリ使用可能量を増やしても、そのテスト(単一のArrayの要素数をふやしていく)の結果は変わりません。代わりにObjectを増やした下記のようなコードは通るようになります。(が、GC頻発で遅くなるので、そのあたりの調整も要るでしょう)
var a = new Array(5);
for( j=0; j<a.length; j;;){
var b = new Array(4e7);
for( i=1;i<b.length;i;;){ b[ i ] = 0; }
a[j] = b;
}
なお単なるArrayではなく、Float32Arrayとか使った方が断然はやくて取れる要素も多かったですよ。
jzkey
2020年7月1日水曜日 3:53
まず Edge の最新バージョンは 83.0.478.58 なので、そこまで更新してみてください。また Chrome でも同じ現象が起きるか確認してください。
最新版の Edge / Chrome で同じエラーになるようであれば、現時点での制限の可能性がありますので、フィードバックされると良いでしょう。
なお新しい Edge (Chromium ベースのもの)は手動でダウンロード/インストールした場合は以下の方法でアンインストール可能ですが、Windows Update で提供された場合はsアンインストールできません。
https://jpdsi.github.io/blog/internet-explorer-microsoft-edge/how-to-uninstall-edge/
Hebikuzure aka Murachi Akira
2020年7月1日水曜日 6:35
早速の対応有難うございます。
(1)現在、自動的にEdgeは最新となっていました。
(2)コントロールパネルからのはアンストールは灰色で
実行不可となっています。
(3)Edge上のJavaScript計算容量は
以前の10分の1に減少、
Chromeと同じとなっています。
(4)現在当方の技術計算での限界容量
ブラウザ 行列計算 変数数
以前のEdge 16562x16562 (2.7e8個)
現在のEdge 5202x5202 (2.7e7個)
Chrome 5202x5202 (2.7e7個)
IE 7442x7442 (5.5e7個)
Firefox 16562x16562 (2.7e8個)
となっています。元のEdgeに復活は不可能ですか
当方は何か間違いですか、対処方法お願いします。
2020年7月1日水曜日 10:05
実際に行われている計算がどのような用途でどのような内容か分からないので何とも言えませんねえ。
単純な JS の実行であれば node 環境などに移行するのは一つの手ですが、node もJavaScript エンジン自体は Chrome/Edge と同じなので、同じ制限があるかも。
Hebikuzure aka Murachi Akira
2020年7月2日木曜日 16:12
コメント有難うございます。
Edgeの限界容量と当方の用途とは関係がないと思いますが返答しますと、
当方の目的としては偏微分方程式の数値解であり、その方法に有限要素法
で行列計算しています。16562x1652の行列とは、16562元1次連立方程式
のことで、その計算をコレスキー法で行っています。前記の如く変数量が
多い故、ここで Out of memory になっていると推定しています。
JavaScriptのhtmlファイルは 269KB、グラフィックにJQueryも使用しています。
用途は、歪(ひずみ)と応力の検討としています。
「node環境などに移行」は、どんなメリットがあるでしょうか、
以前なら、EdgeはChromeよりはるかに計算可能容量に優れていました。
node.js を使用すると計算容量の能力向上の可能性があるのでしょうか、
とりあえず、次のをコンソールアプリにて容量限界のテストを行いました。
var a = new Array(8.95e7)
for( i=1;i<=8.95e7;i;;){ a[ i ] = 0 }
console.log('The array finished')
この 8.95e7 が限界となりました。
今回当方が問題としているEdge の 1.2e8 より低い値であり、
従って、node.js の使用は不適となります。当方は
nodeは知らないので感覚的に意味が分かりません。
これを勧められたのはどうしてでしょうか、
なお、先日のコミュニティへ投稿していましたが、
当方の投稿文末にテスト(1)~(3)の比較をしていますが、
この比較のより、nodeは劣ります。
Edgeは粋を集めたブラウザのはずで、これがOut of memory
とはどうしても不思議です。宜しくお願いします。
2020年7月2日木曜日 22:48
chromeもEdge(2020)もnodeも、みなJSはV8エンジンなわけで、
max_old_generation_sizeを好きなだけ大きくしてプロセスを起動すればよいのでは。
jzkey
2020年7月3日金曜日 2:11
レガシー Edge の JavaScript エンジンは Chakra、新しい Chromium 版の Edge の JavaScript エンジンは V8 で、この違いが利用可能なメモリ サイズに影響しているのでしょう。
V8 の利用可能メモリ サイズの変更については「Raise Chrome JS heap limit?」を参照してください。
Hebikuzure aka Murachi Akira
2020年7月3日金曜日 13:03
jzkey様
サイトで cli: allow --huge-max-old-generation-size in NODE_OPTIONS .
がるようで、NODE_V8_OPTIONSとか、当方には難しいので可也勉学の必要が
あります。結論として、活用すればどの程度の向上が見込めるでしょうか、
最大メモリの本テストの a[i]の値iを数倍にとか、教えて頂きますでしょうか。
2020年7月3日金曜日 14:16
Hebikuzure aka Murachi Akira様
そのサイトに「v8 フラグ」とありますが、難しくて分かりません。
そのスクリプトに、size_t MaxReserved() は JavaScriptでなくC;;なのか
基本的なところも分かりません、また本トラブルに直接関係ありのか、
分からないのが現状なのですが、その操作でどの程度の効果が
可也見込めるのでしょうか、教えて頂きますでしょうか。
なお、当方、随分前2012年にですが、計算容量限界(各種言語)にて
配列サイズ限界の比較表に①~⑨を記述しています。それらを
上回る効果が期待出来るでしょうか。
2020年7月4日土曜日 22:09
jzkey様
有難うございます。色々教わっております。
昔、64bit突入の頃、IEには悩まされました、
今回、それが Edge に置換わった、即ち、
Edgeが技術計算に不向きになり、これが
世の流れと受け止めております。
(1)node.jsがお勧めのようですが、技術計算にはそれ程では、
「 node--max-old-space-size-8000 実行ファイル 」
で、前述の当方テストが 8.95e7→1.34e8個 と若干改善。
(2)そのメモリ許容テストで、jzkey様の提案、
b[i]設定、a[j]=b の方式は、驚きの威力です。
node.exeに下記内容のjsファイル
var a = new Array(27000);
for( j=1; j<a.length; j;;){
var b = new Array(27000);
for( i=1;i<b.length;i;;){ b[ i ] = i;}
a[j] = b;}
console.log('★The array finished ';a[1][1];'~';a[27000][27000])
が実行できました。即ち、要素数は 27000x27000= 7.3e8 個
この時のコマンドプロセッサの占有メモリは 5900MB に達してました。
素晴らしいです!
(3) var a = new Float32Array(2.1e9) で、a[ i ] = 0.1
が出来ました。実行中、タスクマネージャ表示メモリ
30%台と減少の程でした、残念ながら、
a[2e9] の値表示が 0.1 でなく 0.000000149011612
なので、誤差の為、連立方程式の計算にはやや不適。
(4)上記の脅威のテスト a[j]=b を Mozilla社の
ブラウザ Firefox で 55000x55000(=3.03e9)が実行できました。
時間10分越えも、要素数30億個で、node の7億個を
遥かに上回ります。即ち、nodeを使用せずにブラウザでの
計算が、計算可能容量を大きく得られることになります。
以上、jzkey様のアドバイスを頂、報告です。
今後も何卒宜しくお願いいたします。
2020年7月6日月曜日 7:24
morisujiemonさん、こんにちは。フォーラムオペレーターのHarukaです。
MSDNフォーラムにご投稿くださいましてありがとうございます。
フォーラムに投稿くださいましてありがとうございます。
本件、jzkeyさんより参考になる投稿が寄せられたようでなによりです。
[回答としてマーク]機能は設定された投稿が後から参照しやすくなりますので、
同じ問題でお困りの方のためにも参考になった投稿に設定いただけますと幸いです。
お手数ですが、ご協力の程どうかよろしくお願いいたします。
MSDN/ TechNet Community Support Haruka
~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~