2011-04-18 36 views
2

我一直在查看node-dirty的代碼,並注意到當將大量數據寫入文件時,原始程序員選擇將寫入分成幾組,一次一個地發佈組的寫入,但它們都是作爲一個循環的一部分同時發佈的,而不用等待任何回調。我有三個關於這個問題。我有一個類似的問題需要解決。在node.js中寫入流上的多次寫入

  1. 這樣更有效嗎?我應該捆綁寫作嗎?
  2. 我應該如何選擇最佳的包裝尺寸?爲什麼不寫一個組?
  3. 如果我註冊寫入流上的on('drain')事件,它會在所有同時發出的寫入完成後才發出一次嗎?或之後? (我的猜測是前者)
  4. 如果發出on('error'),那麼('drain')事件是否也會被髮射?或者它們是互斥的?

感謝

+0

你可以顯示一個指向node-dirty部分的鏈接嗎? [鏈接](https://github.com/felixge/node-dirty/blob/master/lib/dirty/dirty.js) – Raynos 2011-04-21 20:20:36

回答

2

這是在某些方面更有效率? 我應該捆綁寫入嗎?

做很多小寫操作是低效的。發送寫入命令的開銷已經附加到它上面。所以寫入5個字節而不是1000個字節會更昂貴。

我應該如何選擇最佳包裝 尺寸?爲什麼不寫一個組?

最佳尺寸聽起來像是一種黑色藝術給我。我認爲沒有把它寫成一個大寫字母是有很好理由的。可能會在稍後和之後開始寫作。稍早開始稍微高效一點。

如果我註冊到的(「漏」)上的writestream事件 ,將它發射 只有在所有同時發行 寫入完成後一次?或每個 後? (我的猜測是前者)

當寫入隊列中的所有內容都寫完後,Drain觸發。所以只要你寫入隊列的速度更快,然後寫入它,它應該只觸發一次。你需要一個系統的地獄來拉動這樣的邊緣情況。

如果發出on('error'),還會發出('drain')事件 ? 或者它們是相互排斥的?

即使排放出來,在'drain'中進行錯誤處理也沒有意義。如果發生錯誤,我總是會認爲整個寫入操作失敗,並且不會嘗試恢復中間寫入。

+0

爲了澄清,我不打算處理流失中的錯誤。但我有我的成功經理人流失。我只是想確保它不被解僱:) – Vishnu 2011-04-21 20:40:16

+0

@Vishnu那麼它應該沒問題。儘管如此,我會仔細檢查源代碼 – Raynos 2011-04-21 20:41:07

0

對於4.如果發出on('error'),是否還會發出('drain')事件?或者它們是互斥的?

由於您不想維護應用程序中的狀態,因此您很擔心。所以,也許你可以使用一個方便的功能:

function not_if(proc, veto_inner) { 
    var vetoed = false; 
    return { 
    proc: function() { 
     if (!vetoed) { return proc.apply(null, arguments); } 
    }, 
    vetoer: function() { 
     if (!vetoed) { 
     vetoed = true; 
     veto_inner.apply(null, arguments); 
    } 
    }; 
} 

現在,你可以設定「錯誤」處理程序vetoer和「漏」處理程序「PROC」,而不是wirry關於「漏」後'被稱爲錯誤「被調用。