2017-07-24 116 views
1

我使用node.js和我的WebStorm IDE来解析一个大的JSON文件(〜500兆字节)。这里是我的代码:尽可能快地执行代码

fs = require("fs"); 
fs.readFile('C:/Users/.../Documents/AAPL.json', 'utf8', function (err,data) { 

for (i = 0; i < 1000; i++) { 
    var hex = JSON.parse(data)[i]._source.layers.data["data.data"]; 

    var askPrice = parseInt(hex.substring(215, 239).split(":").reverse().join(""),16); 
    var bidPrice = parseInt(hex.substring(192, 215).split(":").reverse().join(""),16); 
    var symbol = hex.substring(156, 179); 
    var timestamp = hex.substring(132, 155); 
    var askSize = hex.substring(240, 251); 
    var bidSize = hex.substring(180, 191); 
    var price = String((+bidPrice+askPrice)/2); 
    var realprice = price.slice(0, price.length - 4) + "." + price.slice(price.length - 4); 

    function hex2a(hexx) { 
     var hex = hexx.toString(); 
     var str = ''; 
     for (var i = 0; i < hex.length; i += 2) 
      str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); 
     return str; 
    } 
    if(JSON.parse(data)[i]._source.layers.data["data.len"] == 84 && realprice.length == 8 && +realprice <154 && +realprice >145) { 
     console.log(i + " " + hex2a(symbol.replace(/:/g, "")) + " sold for " + realprice + " at " + parseInt(timestamp.split(":").reverse().join(""), 16)); 
    } 
} 

}); 

我遇到然而,问题是,我的IDE以非常缓慢的速度第二解析该文件,大约1迭代。我不认为这是因为我的计算机很慢,因为我有一个核心i7 7700k和gtx 1070的高端钻机。我尝试在控制台中执行代码,结果相同。我试着修剪下来的代码,并再次实现了我同样的速度:

fs = require("fs"); 
fs.readFile('C:/Users/Brandt Winkler Prins/Documents/AAPL.json', 'utf8', function (err,data) { 

for (i = 0; i < 12000; i++) { 
    var hex = JSON.parse(data)[i]._source.layers.data["data.data"]; 

    var askPrice = parseInt(hex.substring(215, 239).split(":").reverse().join(""),16); 
    var bidPrice = parseInt(hex.substring(192, 215).split(":").reverse().join(""),16); 
    var price = String((+bidPrice+askPrice)/2); 
    var realprice = price.slice(0, price.length - 4) + "." + price.slice(price.length - 4); 

    if(+realprice <154 && +realprice >145) { 
     console.log(realprice); 
    } 
} 

}); 

我应该如何执行我的代码,让我的数据尽可能快的?

+1

你真的需要重新解析'JSON.parse(数据)'文件每次迭代?并做两次。 – zerkms

+0

这就是答案!我这样做了,它在一秒钟内执行了12000次迭代!很棒,谢谢。 – BWP

+0

如果json是静态的,你可以只需要它:var obj = require('path/to/json')。为您节省异步回调 – Denis

回答

4

您正在运行JSON.parse(data)每次迭代,这可能需要相当一段时间的500MB json文件。

的解决办法是将其移出循环和再利用解析对象:

var obj = JSON.parse(data); 
for (...