2016-10-10 1 views
1

大きなjsonデータをダウンロードしようとしています。 しかし、Uncaught RangeError: Invalid string lengthにつながります。大きなサイズのjsonをダウンロードするとUncaught RangeErrorを解決する方法

enter image description here

PLSのは、この問題を解決するために、事前に感謝を助けます。ここで

はJsfiddleです:http://jsfiddle.net/sLq3F/456/

+7

plnkr。 (この質問を読んでいる人々に注意してください:あなたがそのフィドルリンクをクリックすると、あなたのCPUファンがスピンアップする準備ができています。) – Pointy

+0

ええ、それは2回文字列化するデータがたくさんあります。そのデータオブジェクトの配列には206560個の項目があります。 –

+0

ここには何の疑いもないので、十分な注意を払っていません。エラーメッセージとリンクがあります。 –

答えて

2

ノート、デバイスでRAMまたは使用可能なディスク領域不足が限られた、Save Fileダイアログが閉じ前Save Fileダイアログ4分20秒でSaveをクリックした後4:20.crdownload拡張子の前に、追加の1分30秒1:30続く、経過ファイルマネージャのGUIでファイルから削除されました。最初の4:20ファイルがファイルシステムにダウンロードされ、Save Fileダイアログが表示されている間、マウスポインタは移動可能ですが、UIは一時的にクリックやタブの変更に反応しません。 Save Fileダイアログが閉じてファイルがファイルシステムにダウンロード中で、拡張子が.crdownloadの場合、UIは通常の機能に戻ります。

上記のプロセスの終了時に、ファイルは合計サイズ189.8 MB (189,778,220 bytes)のローカルファイルシステムに正常にダウンロードされました。

<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <style> 
 
    code { 
 
     color:navy; 
 
     background-color:#eee; 
 
     padding:2px; 
 
    } 
 
    </style> 
 
</head> 
 

 
<body> 
 
    <button>Request File</button><br> 
 
    <progress min="0" max="189778220" value="0"></progress> 
 
    <output></output> 
 
    <br><br> 
 
    <label></label> 
 
    <script> 
 
    var url = "https://raw.githubusercontent.com/zemirco/sf-city-lots-json/master/citylots.json"; 
 
    var button = document.querySelector("button"); 
 
    var progress = document.querySelector("progress"); 
 
    var label = document.querySelector("label"); 
 
    var output = document.querySelector("output"); 
 
    
 
    var request = (url) => { 
 
     
 
     label.innerHTML = `Requesting <code>${url}</code> at ${new Date()}.<br><br>`; 
 
     
 
     return fetch(url) 
 
     .then(response => response.body.getReader()) 
 
     .then(reader => { 
 
     var decoder = new TextDecoder(); 
 
     var json = ""; 
 
     label.innerHTML += `Request successful.<br><br>Reading request body at ${new Date()}.<br><br>`; 
 
     return reader.read().then(function processData(result) { 
 
      if (result.done) { 
 
       // do stuff when `reader` is `closed` 
 
       return reader.closed.then(function() { 
 
       // return `json` string 
 
       return json; 
 
       }); 
 
      }; 
 
      json += decoder.decode(result.value); 
 
      output.innerHTML = ` ${json.length} of ${progress.max} bytes read`; 
 
      progress.value = json.length; 
 
      return reader.read().then(processData) 
 
      }) 
 
      .then(function(data) { 
 
      var message = `Reading of <code>${url}</code> complete at ${new Date()}. <br><br>` 
 
           + `${data.length} total bytes read. ` 
 
           + `Please allow up to 4 minutes for file to download ` 
 
           + `to filesystem after clicking <code>Save</code>.<br><br>`; 
 
      label.innerHTML += message; 
 
      
 
      var blob = new Blob([data], { 
 
       type: "application/json" 
 
      }); 
 
      var file = URL.createObjectURL(blob); 
 
      var a = document.createElement("a"); 
 
      a.download = "citylots.json"; 
 
      a.href = file; 
 
      document.body.appendChild(a); 
 
      a.click(); 
 
      var closeBlob = (e) => { 
 
       window.removeEventListener("focus", closeBlob); 
 
       blob.close(); 
 
       URL.revokeObjectURL(file); 
 
      }; 
 
      window.addEventListener("focus", closeBlob); 
 
      return message.replace(/<[^>]*>/g, ""); 
 
      }) 
 
      .catch(function(err) { 
 
      console.log("err", err) 
 
      }) 
 
     }); 
 
    } 
 
    
 
    var handleRequest = (e) => { 
 
     button.setAttribute("disabled", "disabled"); 
 
     request(url).then(function(message) { 
 
     console.log(message); 
 
     button.removeAttribute("disabled"); 
 
     }) 
 
    }; 
 
    
 
    button.addEventListener("click", handleRequest); 
 
    </script> 
 
</body> 
 
</html>

あなたは** ** 181メガバイトのファイルを取得しようとしているhttps://plnkr.co/edit/gewixzHZSKRXquZ2OVF2?p=preview

+0

ボタンをクリックするとロードされているようですが、DevToolsにつながる時間がかかった後、ページから切断されました.Plsは私を助けます.. – selvarajmas

+1

@selvarajmas 'Save'をクリックすると4分以上かかった'Save File'ダイアログを閉じます。ローカルファイルシステムへのファイル書き込みが完了するまでにさらに1分30秒かかります。あなたが試したデバイスでどのくらいのRAMが利用できますか? – guest271314

+0

私はメモリ(RAM)をインストールしました。3GB – selvarajmas

0

私はあなたがJSONファイルで何かをループする必要があり、より管理しやすい文字列にそれを分割うと思います。

トム

あなたはJSONファイルをスニペットの例を持っていますか?

+0

私は修正する必要があります – selvarajmas

0

PHPを実行しているサーバーはありますか?

私はあなたが絶対にあなたのPHP.iniファイルをチェックするか、phpinfoページを実行する必要があると信じています。なぜなら、php設定は外部リクエストではなくてもファイル転送のサイズを制限するからです。それは他の言語でも可能ですが、PHP以外ではこの問題は一度もありませんでした。

P.S.私はファイルのサイズを見ませんでした

0

私はあなたのJSONファイルが "TOO BIG FOR JSON"シナリオの1つだと思います。 jsonファイルに非常に多くのレコードがある場合(テストに基づいて、100000レコードがブラウザをハングアップさせ、多くのブラウザでロードできなくなった場合)、使用することはお勧めしません。

あなたはより多くの情報については、この記事を読むことができます:あなたはReadableStreamTextDecoder()Blob()URL.createObjectURL()返しfetch()Response.body.getReader()を使用することができますHOW BIG IS TOO BIG FOR JSON?

関連する問題