2013-01-10 94 views
1

我有一個字符串列表,我想根據每個文件的一個關鍵字輸出到不同的文件中(這個關鍵字存在於列表中,所以如果這個關鍵字在某個節點中是1,那麼字符串需要是寫入文件1.txt,如果該鍵是2,那麼輸出應該被重定向到2.txt,等等......)。批處理

我在想的是爲每個列表成員分配一個唯一的密鑰,使其成爲唯一的記錄,然後根據系統中可用的處理器數生成多個線程。線程將節點池(即我的列表)中的節點輸出重定向到相關文件。我懷疑這是否是批量處理的好設計。或者我應該只有一個線程來完成整個輸出。

ps - 在我受到傷害或任何事情之前,讓我告訴你我只是一個好奇的學習者。

+0

是一個字符串文本文件的輸入列表以及例子?如果是這樣,這聽起來像(awk/perl/phython/php等)腳本會更容易。正如@bobah所說,你很可能會受IO限制,在這種情況下,多線程不會對你有所幫助。 –

+0

沒有簡單的鏈表,其中一個成員是一個字符串。我希望程序可以跨各種處理器進行移植,即它可以在單處理器和多處理器上工作。我的程序中有一些工作數據結構,可以告訴我係統中有多少個處理器。那麼我應該爲單處理器和多處理器製作兩個不同的版本嗎?(取決於系統中存在多少處理器) – Varun

回答

0

使其成爲單線程。然後運行,找出你的瓶頸。如果你發現,你的瓶頸是CPU而不是磁盤IO,那麼啓用並行處理。

0

據我瞭解你的處理步驟是:

  • 通過密鑰
  • 寫入項目中選擇文件到文件

我想,這是不是當可能導致性能並行處理的情況下改進。如果你想加快這個代碼 - 使用緩衝和異步I/O。

  • 爲每個文件維護一個標誌 - 寫在進步
  • 當你想寫點東西到文件 - 檢查該標誌
    • 如果寫在進步爲False:
      • 設置寫在進步 =真
      • 添加您的物品緩衝
      • 開始寫這個緩衝到文件異步
    • 如果寫在進步是正確的:
      • 添加項未決的異步操作完成時緩衝
    • 檢查是否有非空緩衝區,如果是的話啓動異步寫入

還有更簡單的辦法:使用緩衝和同步I/O。它將比上述的異步方法慢,但不是很多。您可以獨立地在每個線程中啓動多個線程和遍歷列表。每個線程只能處理一些唯一的密鑰集。例如,您可以使用兩個線程,第一個線程必須只寫入具有奇數鍵的項目,第二個線程必須只寫入具有偶數鍵的項目。

+0

這就是我想要做的,有點。 這將清楚(可能): 我有一個鏈表,它的節點有以下成員: (i)字符串to_write(一定長度)。 (ii)file_name(我追加'to_write'的文件的名稱/ ID)。 和更多的東西。 我可以通過對列表編制索引來將此數據寫入並行文件嗎?如果我有多個處理器可用,爲什麼不充分利用它呢? 這只是爲了學習一點關於並行處理和批處理。但我想你對你給出的解釋是正確的。 – Varun

+0

繼續。 由於瓶頸將是我擁有的文件數量,所以無論我擁有多少個線程,每次只能有一個線程寫入一個文件。所以我想每個文件方法與緩衝區結合的標誌(或信號量)會更好。 – Varun

+0

您不需要索引列表來並行處理它。只需在每個線程中獨立遍歷列表並忽略一些元素。如果密鑰均勻分佈 - 不需要負載平衡。 – Lazin

0

你需要一個併發模型 - 但是嚴重聽起來:)

首先分析一下,可以在同一時間進行,是彼此無關。設想你的程序的每一步都是在不同的機器上執行的, IP網絡。

然後在這些實例(動作/機器)之間繪製一個流。標記動作需要執行的資源,例如一個列表,一個文件。將資源標記爲單獨的實例(與操作和計算機相同)。

將文件系統放在圖片中,看看是否可以加快單獨文件的寫入速度,或者它會在文件系統中結束,從而再次序列化。

連接實例。看看你是否有任何好處。它可能看起來像:

 list 
     | 
     list reader 
     /\  \ 
    / \  ----------\ 
    file file   file 
    writer writer  writer 
    |  |    | 
    file 1 file 2   file 3 
    \  /   | 
     \ /    | 
    file system 1  file system 2 

你可以看到,它可能是有意義的得到一些並行執行