我手頭上的任務是讀取大文件的行,處理它們,並返回有序的結果。erlang進程和消息傳遞體系結構
我的算法是:
- 開始與主過程,將評估的工作負荷(寫在該文件的第一行)
- 產卵工作進程:每個工人將讀取的文件的一部分使用前綴/ 3,處理該部分,並將結果發送給主設備
- 主設備接收所有子結果,進行排序並返回 因此基本上不需要工作人員之間的通信。
我的問題:
- 如何找到Erlang進程的數目和內核的數量之間的最佳平衡?所以如果我爲每個處理器內核產生一個進程,我將使用我的cpu?
- pread/3如何到達指定的行;它遍歷文件中的所有行嗎?並且pread/3是一個很好的並行文件讀取計劃?
- 從流程A發送一條大消息到B還是發送N條小消息會更好嗎?我發現在下面的鏈接部分答案,但我希望進一步闡述
erlang message passing architecture
文件內存映射了嗎?如果沒有,那麼讓多個演員隨機訪問該文件的不同部分可能會[減慢你的速度](http://stackoverflow.com/questions/17220892/read-the-30million-user-ids-one-by-one-from -the-big-file/17220973#17220973),因爲只有一個演員可以在任何時候讀取磁盤,如果你有磁盤,那麼每個演員都會觸發磁盤尋道。我建議讓主映射文件的全部(或大部分,如果文件很大)映射到內存中,然後讓工作人員在這個內存映射(部分)文件上操作。 –
@ Zim-ZamO'Pootertoot是對的。通常,我的方法是讓「主」逐行讀取文件(或逐段讀取),然後將這些行分配給多個「工作人員」進行處理。如果您以二進制(而非列表)字符串讀取文件,這可能非常快,因爲大於64字節的二進制文件被引用計數,並且在將消息發送到另一個進程時具有較低的複製開銷。 –
原則上我同意。然而,由於erlang和[line_sever模塊](https://github.com/dcaoyuan/snippet/blob/master/widefinder/src/line_server_modified.erl)中的緩慢seo的io,2007年一直很流行。它同時讀取文件。我現在想了8年後,最好的辦法是什麼。 – ErlangNewbie