使用Papa解析的大字符串导致Chrome和Opera崩溃

时间:2015-05-12 07:38:13

标签: javascript papaparse

如果我试图用大约20列解析大约100万行的“大”csv字符串,那么Papa Parse似乎会导致Chrome和Opera崩溃(Windows 7)。在Firefox中成功加载同一页面的位置。如果我定义了一个大的csv字符串并且包含< script>,那么即使在调用Parse之前Chrome和Opera也会崩溃标记到papaparse.js库。如果我不包含< script> papaparse.js的标签创建大型csv字符串没有问题,但我无法解析它们。在我的实际用例中,我没有在javascript中生成大型csv字符串,而是将它们从zip存档中拉出来。如果我使用step或chunk函数,似乎没有任何区别。你可以在这里运行测试用例; Test Case 问题代码;

<!doctype html>
<html>

<script src="http://papaparse.com/resources/js/papaparse.js"></script>

<body>

<script>

 function my_createMockCSV(rows) {
  var my_csv="a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v\r\n";
  for (var i=1; i<rows; i++) {
   my_csv+= i+","+ i+","+ i+","+ i+","+ i+","+ i+","+ i+","+ i+","+
            i+","+ i+","+ i+","+ i+","+ i+","+ i+","+ i+","+ i+","+
            i+","+ i+","+ i+","+ i+","+ i+","+ i+","+"\r\n";
   }
 return my_csv;
 }


function parseCSV(csv) {

 var rowcount=0;

 Papa.parse(csv, 
               {
               delimiter: ',', 
               worker: false,
               encoding: 'default',
               header: true, 
              chunk: function(results) {
                 rowcount+= results.data.length;
                console.log("Parsed rows: "+rowcount);
               },
             complete: function (results) { 
                 console.log("Complete - parsed: "+rowcount+" rows");
               }
            });

 }

function run_testcase() {
 rows=document.getElementById("rows").value;
 //parseCSV(my_createMockCSV(rows));  
 console.log("Begin Generating CSV ...");
 alert("About to generate Mock CSV");
 var my_csv=my_createMockCSV(rows);
 console.log("End Generating CSV ...");
 alert("About to parse Mock CSV");
 parseCSV(my_csv);
}

</script>

Papaparse test case script: Will crash Chrome, Opera<br/>

Rows: <input id="rows" type="number" value="1000000"> (Try around 1mil rows)
<button onclick="run_testcase();">Run</button>

</body>
</html>

1 个答案:

答案 0 :(得分:0)

Papa Parse并没有导致浏览器崩溃。

对于像Firefox这样的字符串,Chrome和Opera效率不高。你根本无法在内存中创建一个包含百万行和20列的字符串,就像你正在做的那样,并期望浏览器标签保持稳定。

注释掉Papa.Parse()的来电,你就会明白我的意思:浏览器仍然崩溃。