2017-02-12 78 views
0

我正在執行以下日期本地化代碼。但它佔用的內存太多(約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 
} 

所以問題就在這裏: -
- 爲何需要太多的內存?
- 這個日期對話或任何優化方式的任何替代?
- 如果它佔用太多內存,那麼爲什麼在代碼執行後不釋放內存? (即使我手動調用「gc()」仍然沒有釋放內存。)
- 我試圖通過命令行(--max-old-space)控制內存限制(堆大小),但它失敗。
- 我嘗試使用新貴限制選項(提供硬限制和軟限制)來控制內存限制,但不起作用。

我正在使用節點0.12.8版本。

任何幫助是可觀的。 :)

+2

你的循環的內容與'key'或'_array'有什麼關係?另外,'for..in'用於_Object_迭代,如果你知道你想迭代_Array_使用一個普通的['for'](https://developer.mozilla.org/en/docs/Web/JavaScript/參考/語句/對)。 '_ts_string'看起來正在成爲一個全球性的? –

+0

是否需要爲每個迭代創建新的Date對象? –

+0

@PaulS。我忘了在這裏提到。它已經被定義。 –

回答

1

你不需要循環內新的。您正在爲每個項目創建一個新的Date對象。在循環內部,請嘗試:

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

您還缺少「;」在幾行上。

+0

讓我試着用結果和整個npm寫入更新,而不用「;」。沒關係...... :) –

+1

-1。沒有'new'的情況下調用['Date'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)會有很大的不同。這不起作用。 – Bergi

+0

@Bergi爲什麼-1,調用Date作爲一個函數返回字符串,這就是OP正在嘗試做的事情。 –

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日期對象將採取一些資源&時間明顯。