日期对话占用太多记忆

时间:2017-02-12 19:00:54

标签: javascript node.js

我正在执行以下日期本地化代码。但它占用了太多的内存(约2 gb)。

 var options = {  
        year: 'numeric', month: 'short', day: 'numeric',
        hour: 'numeric', minute : 'numeric', 
        second: 'numeric' ,timeZone : 'Asia/Calcutta', 
        timeZoneName: 'short',hour12 : false};
 var _ts;

// length approx 80k
var _array = [1486901778700, 1486901778700, ....., 1386901778700.0 ] 
var final_string = ''

for(var key in _array) {
  //======>>this conversation taking too much memory (around ~2gb) <<======
  _ts_string = new Date(_debug_data.timestamp).toLocaleString('en-US', options)
  final_string += _ts_string
}

所以问题在这里: - - 为什么要占用太多内存? - 此日期对话的任何替代或任何优化方式??
- 如果它占用了太多内存,那么为什么在代码执行后没有释放内存? (即使我手动调用&#34; gc()&#34;仍然没有释放内存。)
- 我尝试通过命令行(--max-old-space)控制内存限制(堆大小),但它失败了。
- 我尝试使用upstart限制选项(提供硬限制和软限制)来控制内存限制但不起作用。

我正在使用节点0.12.8版本。

任何帮助都是值得的。 :)

2 个答案:

答案 0 :(得分:1)

你不需要循环中的新内容。您正在为每个项目创建一个新的Date对象。在循环内部,尝试:

final_string += Date(_debug_data.timestamp).toLocaleString('en-US', options);

你也缺少&#34;;&#34;在几行上。

答案 1 :(得分:0)

由于javascript字符串是不可改变的,因此可能首先创建一个字符串数组,然后在结尾处加入它们会更快/更轻。

var strings = [];
for(var key in _array) {
  strings.push(new Date(_debug_data.timestamp).toLocaleString('en-US', options));
}

var final_string = strings.join();
console.log(strings.length);

但无论如何,80k日期对象将需要一些资源和时间显然。