2013-03-03 62 views
3

最近我在一次採訪中被問到了這個問題。如何在讀取/寫入文件時克服硬件限制。

給定一個輸入文件,一個正則表達式和一個輸出文件。讀取輸入文件,將每行匹配到正則表達式,並將匹配行寫入輸出文件。

我想出了使用鏈接到FileReader的BufferedReader(以優化磁盤讀取)的粗略方案。我使用了類似的寫法。

面試官然後說,這個過程需要3秒鐘從文件讀取一行,1秒比較正則表達式和行,另外5秒鐘回寫。所以每行總共需要9秒。我們該怎樣改進這個?

我建議一次讀取整個文件,處理它並一次寫入整個輸出文件。然而,我被告知,這將無濟於事(寫1行= 5秒,寫2行= 10秒)。

面試官進一步表示,這是由於硬件/硬盤驅動器的限制。我被問到如何改進我的代碼以減少每行的總秒數(目前爲9)?

我只能想到緩衝讀/寫,並且在SO上也找不到太多。有什麼想法嗎 ?

+0

多線程和同步?你不需要等待1秒的正則表達式處理,並繼續閱讀下一行。在正則表達式處理完之後,另一個正在等待匹配行的線程可以寫入輸出。但我懷疑這最後一步會帶來很大的改進,因爲你有一張光盤,它可以讀或寫一個特定的時刻。 – A4L 2013-03-03 14:22:40

回答

2

我認爲面試官正在尋找一種解決方案,在寫入輸出的同時執行讀取/正則表達式檢查。如果您設置了一個通過讀取和過濾來異步填充的工作隊列,並將其寫入單獨的線程,那麼組合過程每行需要五秒鐘,從第二行開始。

這裏的假設是,閱讀,解析和書寫可以獨立發生。在這種情況下,您可以在寫入第1行的同時閱讀第2行:您只需要四秒鐘即可閱讀和應用您的正則表達式,並且在作家準備好第二行之前已經有整整五秒的時間。寫作仍然是你的瓶頸,但整個過程加快了44%,這並不壞。

0

既然讀取的時間是固定的,寫入的時間是固定的,那麼在這種情況下唯一的選擇是改變正則表達式的性質。

您可以編寫代碼來快速應用正則表達式測試,而無需使用正則表達式可以執行的所有聰明事情的開銷。

另一方面,如果問題是每個IO請求需要幾秒鐘才能執行,但限制不是實際的驅動器,則需要多個讀取器同時讀取。

0

棘手的問題,因爲我們沒有太多關於該系統。

我的猜測是使用線程/異步處理。使用一個線程讀取,一個線程處理兩個或兩個以上的寫入,從而減少IO Wait所花費的時間。

讓我嘗試將其轉換成ASCII表:

  • R/R表示閱讀(3秒)
  • P/p爲處理(1秒)
  • W/W表示寫(5秒)

大寫字母標記開始,小寫字母標記繼續工作。 A「:」指線程空閒

Thread 1: RrrRrrRrrRrrRr 
Thread 2: ...P..P..P..P. 
Thread 3: ....Wwwww 
Thread 4: .......Wwwww 

有了這個設置的第一批迴來後9秒(這裏不多做),但12秒後第二個完成寫入。單線程第二個需要18秒總計