我有一個處理特定二進制協議的TCP服務器。一些請求包含大量要寫入文件的數據。該服務器使用NIO框架(netty),並具有邏輯來處理已分解爲多個幀的消息。保持文件句柄打開,或根據需要重新打開?
當個別幀進入時,如果該幀中的數據要寫入文件,則打開該文件並寫入數據。即使數據流還沒有完成,我期望有另一個數據幀被附加到同一個文件,但我現在關閉文件,直到我接收到下一個幀,此時我重新打開它並追加附加數據。
我選擇了這種方法,因爲它似乎是最安全的方法來避免左右打開文件句柄,並且通過一些錯誤不關閉它們,但是,我擔心這會對性能產生負面影響。是否更好(或在這種情況下是最佳實踐)使文件句柄保持打開狀態(以便保留對打開的FileOutputStream或Channel的引用)?打開文件句柄的數量是否存在資源限制問題?
你在考慮什麼樣的音量(同時打開的文件)?你多長時間收到這些幀 - 或多或少的流/實時?或者延誤很長?遊戲中的限制在這方面往往達到數百(或數千)。並且打開/關閉文件所需的時間與幀之間的延遲時間可能是一個考慮因素。 – BRFennPocock 2011-12-20 23:03:45
所有這些都是好點@BRPocock:對於這類問題中的大多數問題,需要考慮的是真實的工作量。 – 2011-12-20 23:15:03
@BRPocock的音量有希望增加,所以我只是試圖找到最佳可擴展性的甜蜜點。幀是流/實時的(所討論的幀只是單個TCP數據包)。我試圖平衡我認爲最安全和最具擴展性(關閉文件)的內容,以及可能表現最佳(保持打開狀態)的內容。 – 2011-12-20 23:45:38