2013-06-20 27 views
1

我已經搜索找到我的問題的答案,但我沒有找到解決方案來滿足我的需求。PERL - 多線程在一個非常大的文本文件中搜索術語列表

我有一個很大的文本文件(4GB),這是來自代理的access.log文件。

我有另一個文件,其中包含7000行,其中包含一些域名地址或url的一部分,以搜索我的日誌文件。

問題是,在日誌文件中搜索我的7000條款,花了很長時間。

我想減少這次使用多線程或其他東西。

但我從來沒有編程的這樣的事情之前: -/

你能幫助我開始?

在此先感謝!

+0

該操作很可能是I/O綁定的,在這種情況下,多線程無助於此。 –

回答

1

概念(不特定的Perl),我會像這樣的東西去:

  1. 創建N個線程,並指定每個7000/N正則表達式來測試。
    • 優選地,N =可用機器線程的數量。
    • 根據正則表達式的複雜性或長度,可能值得爲每個線程分配更多或更少的正則表達式。目標是所有線程將被分配大致相同的工作量。這可能需要對正則表達式進行繁重的預處理。
  2. 將大塊數據加載到內存中。
    • 您可以在這裏試驗不同的尺寸。
    • 目標是加載此數量的數據將花費大致一樣長的線程將採取處理它。
  3. 在您剛加載的數據上啓動您的正則表達式線程。並行地,使用另一個線程將下一塊數據加載到內存。
  4. 等到所有線程完成。
  5. 放棄先前加載的第一批數據。
  6. 後藤(3)

優點:

  1. 緩存友好的 - 所有的線程在同一時間掃描相同的數據。
  2. 數據流 - 您需要在內存中保存的數據大小一次最多爲2 *(塊大小),這使其在內存上非常便宜,並且完全不受數據大小的影響。
  3. 可擴展 - 更多可用線程將立即轉化爲速度(只要您適當調整塊大小)。
    • 這裏有一些限制,當然。在某個點上,塊的大小會非常大,以至於可能會由於內存不足而減慢正則表達式的線程數 - 在這一點之後添加更多的線程可能只會減慢速度。

另外,儘量使每個線程維護自己的比賽,不要將它們同步到相同的位置 - 它可以創建一個比賽條件。如果需要同步線程,請在上述步驟(4)和(5)之間執行。

不幸的是,我的Perl很生鏽,但直到你得到更好的答案,我會發布這個,希望它會有用。

相關問題