我有一個腳本來擦去~1000個網頁。我使用Promise.all解僱他們在一起,並將其返回時,所有頁面都做:無法完成由於內存不足導致的承諾
Promise.all(urls.map(url => scrap(url)))
.then(results => console.log('all done!', results));
這是甜的,正確的,除了一臺件事 - 機器進入了內存併發的,因爲要求。我使用jsdom
進行報廢,它很快佔用了幾GB的內存,考慮到它實例化了數百個window
,這是可以理解的。
我有一個想法來解決,但我不喜歡它。也就是說,變更控制流程不使用Promise.all,但我的鏈條承諾:
let results = {};
urls.reduce((prev, cur) =>
prev
.then(() => scrap(cur))
.then(result => results[cur] = result)
//^not so nice.
, Promise.resolve())
.then(() => console.log('all done!', results));
,因爲它的鏈接這並不像Promise.all好......不是高性能,並且返回的值必須被存儲供以後處理。
有什麼建議嗎?我應該改進控制流程,還是應該改進scrap()中的mem使用情況,還是讓節點節流mem分配?
我不明白你的意思了「*未高性能的,因爲它是鏈接*」 – Bergi
順便說一下,它需要'。那麼(()=>廢料( cur))' – Bergi
@Bergi也許我錯了。我認爲緩慢的部分是對網址的請求。在鏈接版本中,您只能在完成之前網址上的所有剪貼工作後才能觸發下一個請求。在Promise.all版本中,它們都可以啓動(發送http請求當然是異步的),並在返回時處理。 – Boyang