我正在执行以下日期本地化代码。但它占用了太多的内存(约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版本。
任何帮助都是值得的。 :)
答案 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日期对象将需要一些资源和时间显然。