web-dev-qa-db-ja.com

javascriptオブジェクトの最大サイズ制限

jquery.ajaxメソッドを使用して、サーバー側にJavaScript変数を渡そうとしています。

JSON文字列を作成しようとしていますが、変数の長さが10000に達すると、文字列にデータが追加されなくなります。

var jsonObj = '{"code":"' + code + '","defaultfile":"' + defaultfile + '","filename":"' + currentFile + '","lstResDef":[';
        $.each(keys, function(i, item) {
            i = i + 1;
            var value = $("#value" + i).val();
            var value = value.replace(/"/g, "\\\"");
            jsonObj = jsonObj + '{';
            jsonObj = jsonObj + '"Key":' + '"' + Encoder.htmlEncode($(this).html()) + '"' + "," + '"Value"' + ':' + '"' + Encoder.htmlEncode(value) + '"';
            jsonObj = jsonObj + '},';
            alert(jsonObj);             
        });          

        jsonObj = jsonObj + ']}';

ここで、var jsonObjの文字長が10000の場合、それに続く値は追加されません。

それにはいくつかの制限があるようです。

36
Paras

文字列の長さにそのような制限はありません。確かに、60メガバイトを含む文字列を作成するためにテストしました。

問題は、GETリクエストでデータを送信している可能性が高いため、URLで送信されることです。ブラウザーごとにURLの制限が異なります。IEの最低制限は約2 kBです。安全のために、GETリクエストで約1キロバイトを超えるデータを送信しないでください。

大量のデータを送信するには、代わりにPOSTリクエストで送信する必要があります。ブラウザには投稿のサイズに厳密な制限はありませんが、サーバーにはリクエストの大きさに制限がありますIISたとえば、デフォルトの制限は4 MBですが、それ以上のデータを送信する必要がある場合は、制限を調整することができます。

また、長い文字列を連結するために+ =を使用しないでください。反復ごとに移動するデータが増えているため、アイテムが増えるにつれて速度が低下します。文字列を配列に入れ、すべてのアイテムを一度に連結します。

var items = $.map(keys, function(item, i) {
  var value = $("#value" + (i+1)).val().replace(/"/g, "\\\"");
  return
    '{"Key":' + '"' + Encoder.htmlEncode($(this).html()) + '"' + ",'+
    '" + '"Value"' + ':' + '"' + Encoder.htmlEncode(value) + '"}';
});
var jsonObj =
  '{"code":"' + code + '",'+
  '"defaultfile":"' + defaultfile + '",'+
  '"filename":"' + currentFile + '",'+
  '"lstResDef":[' + items.join(',') + ']}';
67
Guffa

ステップ1では、常に最初に問題の場所を特定します。あなたのタイトルとあなたの質問のほとんどは、JavaScript /ブラウザの文字列の長さの非常に低い制限、おそらく低い制限に直面していることを示唆しているようです。あなたではない。考慮してください:

var str;

document.getElementById('theButton').onclick = function() {
  var build, counter;

  if (!str) {
    str = "0123456789";
    build = [];
    for (counter = 0; counter < 900; ++counter) {
      build.Push(str);
    }
    str = build.join("");
  }
  else {
    str += str;
  }
  display("str.length = " + str.length);
};

ライブコピー

関連するボタンを繰り返しクリックすると、文字列が長くなります。 Chrome、Firefox、Opera、Safari、およびIEを使用して、100万文字を超える文字列でも問題なく使用できました。

 str.length = 9000 
 str.length = 18000 
 str.length = 36000 
 str.length = 72000 
 str.length = 144000 
 str.length = 288000 
 str.length = 576000 
 str.length = 1152000 
 str.length = 2304000 
 str.length = 4608000 
 str.length = 9216000 
 str.length = 18432000

...そして、lotがそれよりも高くなると確信しています。

したがって、JavaScriptの長さ制限とは関係ありません。サーバーにデータを送信するためのコードを表示していませんが、GETを使用している可能性が高いです。つまり、GETパラメータはクエリ文字列に入れられます。 詳細はこちら

代わりにPOSTを使用するように切り替える必要があります。 POSTリクエストでは、データはURLではなくリクエストの本文にあり、実際には非常に大きい場合があります。

8
T.J. Crowder