2008-09-26 39 views
9

我有一個問題,需要我解析遠程機器上的幾個日誌文件。 有一些併發症: 1)文件可能在使用中 2)中的文件可能會相當大(100MB +) 3)每個條目可能是多行通過網絡讀取和解析大型文本文件的最佳方式是什麼?

爲了解決使用中的問題,我需要先複製它。我目前直接將它從遠程機器複製到本地機器,並在那裏解析它。這會導致問題2.由於文件非常大,因此在本地複製文件可能需要很長時間。

爲了增強解析時間,我想使解析器成爲多線程,但是這使得處理多線條條目有點棘手。

的兩個主要問題是: 1)我如何加快文件傳輸(壓縮?是局部轉移甚至neccessary?我可以讀取文件正在使用其他方式) 2)我該怎麼辦在線程之間拆分線時處理多行條目?

更新:我沒有做明顯的解析服務器原因的原因是我想盡可能少的cpu影響。我不想影響系統即時測試的性能。

回答

2

如果您正在讀取一個順序文件,您想通過網絡逐行讀取它。您需要能夠進行流式傳輸的傳輸方法。您需要查看您的IO流媒體技術才能瞭解這一點。

像這樣的大型IO操作不會受益於多線程,因爲您可以儘可能快地處理項目,因爲您可以通過網絡讀取它們。

另一個不錯的選擇是將日誌解析器放在服務器上,然後下載結果。

+0

如果直接通過網絡複製一個100MB的文本文件需要x秒,並有一個遠程客戶端壓縮和發送文件,然後放氣/讀取需要x/4秒,這不值得嗎? (注意,我實際上不知道壓縮/發送/解壓縮/讀取需要多長時間) – midas06 2008-09-26 00:57:14

+0

盡你所能,並且應該在網絡上使用一些壓縮。就像我說的,查看您的IO流選項 - 有些人建議使用一些zip庫。 OTOH如果您可以在遠端安裝程序,請在那裏進行處理! – 2008-09-26 02:07:13

1

考慮到您已經在複製文件,最簡單的方法是在複製之前對其進行壓縮,並在複製完成後進行解壓縮。壓縮文本文件會帶來巨大的收益,因爲zip算法通常可以很好地處理它們。此外,您現有的解析邏輯可以保持完整,而不必將其連接到遠程網絡文本閱讀器。

這種方法的缺點是你不能夠非常有效地逐行更新,這對日誌解析器來說是一件好事。

+0

我很想壓縮它,但是如果我的代碼在本地機器上運行,它將在被傳輸後被壓縮,這會破壞目的。我想病了,最終不得不寫一個客戶端,只做壓縮和發送。 – midas06 2008-09-26 00:53:44

0

我使用SharpZipLib在通過Internet傳輸它們之前壓縮大文件。所以這是一種選擇。

1)的另一個想法是創建一個在遠程機器上運行的程序集並在那裏進行解析。您可以使用.NET Remoting從本地機器訪問程序集。遠程程序集需要是Windows服務或託管在IIS中。這將允許您將日誌文件的副本保留在同一臺計算機上,理論上它將花費更少的時間來處理它們。

0

我認爲使用壓縮(放氣/ gzip的)將有助於

1

我想這取決於它是如何「遙控」。 100Mb局域網上的100MB大約需要8秒鐘......將其提高到千兆位,並且在1秒內完成。 $ 50 * 2的卡,100美元的交換機將是一個非常便宜的升級,你可以做的。

但是,假設它比這更遠,您應該能夠以只讀模式打開它(因爲您在複製時正在閱讀它)。 SMB/CIFS支持文件塊讀取,所以你應該在這一點上傳輸文件(當然,你實際上並沒有說你是如何訪問文件的 - 我只是假設SMB)。

多線程不會有幫助,因爲無論如何你都會被磁盤或網絡綁定。

1

使用壓縮進行傳輸。

如果你的分析確實放慢你失望,你有多個處理器,可以打破解析工作,你就必須做一個聰明的辦法 - 有一個確定性的算法工人負責處理記錄不完整。例如,假設您可以確定某行是記錄中間的一部分,則可以將該文件分解爲N/M段,每個段負責M行;當其中一個作業確定其記錄未完成時,只需讀取,直到記錄結束。當其中一個作業確定它正在讀取一個沒有開頭的記錄時,它應該跳過該記錄。

1

從性能的角度來看,更好的選擇將是在遠程服務器上執行解析。除了特殊情況之外,網絡速度總是成爲瓶頸,因此限制通過網絡發送的數據量將大大提高性能。

這是如此之多的數據庫使用在服務器端運行的存儲過程的原因之一。

通過使用多線程解析速度(如果有的話)的改進將會被網絡傳輸的相對速度所淹沒。

如果您決定在解析文件之前轉移文件,那麼您可以考慮的一個選項是在執行文件傳輸時使用動態壓縮。例如,有可用的sftp服務器可以在運行中執行壓縮。 在本地端,您可以使用類似libcurl的東西來執行傳輸的客戶端,這也支持即時解壓。

1

如果您可以複製文件,您可以閱讀它。所以沒有必要首先複製它。

編輯:使用FileStream class可以更好地控制訪問和共享模式。

new FileStream("logfile", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 

應該做的伎倆。

相關問題