web-dev-qa-db-ja.com

javascript変数にはストレージ制限がありますか?

JavaScript変数にはストレージ容量の制限がありますか?

データベースからデータをフェッチしてjsオブジェクトに格納する1つのYUIデータテーブルを設計しています。必要に応じて、データを抽出してYUIデータテーブルを更新します。現在、Devには、レコードがほとんどなく、正しく保存されていません。本番環境では、数千のレコードがある可能性がありますが、このjsオブジェクトはこれらの数千のレコードすべてを保存できますか?

それができない場合は、jspの非表示のtextareaに作成し、そこにデータを保存します

14
Ajay Gangisetti

はい、オブジェクトと配列にはストレージ制限があります。それらは、ほとんどの目的のために、理論上十分な大きさです。あなたは言語よりもVMによって制限されます。

特定のケース(クライアントに数千のアイテムを送信する)では、JSON、JavaScript、またはJSPページのプレーンテキストであるクライアントメモリのいずれであっても、同じ問題が発生します。クライアントは、言語の制限に遭遇するよりも、使用可能なシステムメモリを使い果たす可能性がはるかに高くなります。何千もの小さなオブジェクトの場合、これは問題にはなりません。

配列には42億アイテムの制限があります 、たとえば 15.4.2.2の仕様 に示されています。これは、長さが32ビットカウンターであることが原因です。各要素が単一の整数であると仮定すると、16GBの数値データを単一の配列に格納できます。

オブジェクトのセマンティクスはより複雑ですが、オブジェクトを操作するほとんどの関数は最終的に配列を使用するため、ほとんどの実際的なシナリオでは42億のキーに制限されます。繰り返しますが、これはdataの16GBを超えており、参照を維持するためのオーバーヘッドをカウントしていません。

VM、そしておそらくガベージコレクターは、言語の限界に近づくかなり前に、長期間ハングし始めます。一部の実装、特に古い実装やインタープリターには、より小さな制限があります。 JS仕様ではほとんどの場合minimum制限が指定されていないため、これらは実装定義であり、はるかに低い可能性があります( この質問 引数の最大数については、それについて説明しています)。

適切な最適化VMを使用すると、そのサイズで、使用する構造を追跡しようとすると、VMがマップの使用にフォールバックするのに十分なオーバーヘッドが発生します。オブジェクトの場合(理論的には、それほど多くのデータを表す構造体を定義することは可能ですが、それほど実用的ではありません)。マップには少量のオーバーヘッドがあり、サイズが大きくなるとルックアップ時間が長くなるため、パフォーマンスへの影響が見られます。オブジェクトサイズ。

別の制限に遭遇した場合、65k要素(2 ^ 16)になると思います この回答で説明したとおり 。ほとんどのブラウザは32ビットアーキテクチャが標準になった後に作成されたため、65k未満の要素をサポートする実装を見つけることはほとんどありません。

18
ssube

そのような制限はありません。

16GBには制限があるようですが、以下のテストまたは@ssubeの回答で読むことができます。

しかし、おそらくオブジェクト/ jsonが約50mbの場合、奇妙な動作に遭遇するでしょう。

Jsonの場合、ここに興味深い記事があります: http://josh.zeigler.us/technology/web-development/how-big-is-too-big-for-json/

Js Objectについては、ここでより多くの知識があります: javascriptオブジェクトの最大サイズ制限 (そのような制限はないが、約40 mbで奇妙な動作に遭遇すると言う)

3
Razvan Dumitru

制限は、ブラウザの使用可能なメモリによって異なります。したがって、すべてのPC、Mac、モバイルのセットアップでは、異なる制限が与えられます。あなたのレコードの1つにどれだけのメモリが必要かはわかりませんが、ほとんどのマシンで1000レコードが機能するはずです。

しかし:レコードメモリによっては、ウェブサイト全体の動作が遅くなるため、単純な変数に大量のデータを保存することは避けてください。平均的なコンピュータを使用しているユーザーは、醜いスクロール効果、遅延したホバー効果などを目にすることがあります。

ローカルストレージを使用することをお勧めします。 YUIライブラリがわからないことをお詫び申し上げますが、データテーブルソースのストレージを指定できると確信しています。

0
chrisbergr