2014-01-08 49 views
1

我在PowerShell中使用Robocopy來排序並輸出數百萬個比用戶指定的年齡更早的文件名。我的問題是:使用Robocopy的日誌記錄功能,然後通過Get-Content -ReadCount導入日誌會更好嗎?還是將Robocopy的輸出存儲在變量中以便腳本不必寫入磁盤更好?哪個更有效率,將輸出存儲在變量或輸出文件中?

我將不得不用正則表達式來獲得實際的文件名。我使用的是Robocopy,因爲許多文件的路徑長度超過248個字符。

是一種比另一種更受歡迎的方式嗎?不要錯過應該被視爲明顯的東西。

+4

基準測試的唯一方法是使用您自己的數據實際執行測試,並比較結果。任何實際上沒有這樣做的東西只是猜測。 –

+0

讓我問一下......存儲輸出後多少次將在該過程的生命期間再次讀取? –

+0

你爲什麼使用Robocopy來達到這個目的?爲什麼不使用PowerShell? –

回答

0

這取決於您正在討論的輸出量以及您的可用系統資源。如果磁盤I/O時間少於內存管理進入內存所需的額外開銷,那麼將它們寫出到文件然後再讀入它們會更快。你可以嘗試兩種方式並且時間,但是我會嘗試將它先讀入內存,同時使用任務管理器進行監視。如果它開始引發大量頁面錯誤,那麼您可能會更適合使用磁盤作爲中間存儲。

2

您可以通過測量跳過所有關於發揮多重因素的理論和猜測多久每個方法都需要使用措施命令,例如:

Measure-Command {$rc_output = robocopy <arguments>}

Measure-Command {robocopy <arguments> /log:rc.log; Get-Content rc.log [...]}

你會得到輸出,告訴你每個版本到底需要多長時間,直到毫秒。試試少量的樣本數據,看哪一個更快,然後將其應用到您的數百萬個文件中。

+0

嘗試使用小樣本將總能以更快的結果保存到變量中。內存耗盡導致的性能問題在您開始將其擴展到足夠的數據以供內存管理參與之前不會顯示出來。 – mjolinor

1

我將添加到@ mjolinor的評論和其他評論。要直接回答問題:

將信息保存到變量(因此保存到RAM)總是比直接到磁盤更快。 僅在以下情況下:

變量旨在用於存儲小數據量(< 10Mb)。它們不是爲了容納諸如整個數據庫的東西而設計的如果數據的大小很大(即數百萬行的數據,即幾十兆字節),那麼磁盤總是更好。問題在於,如果將大量信息放入變量中,則會填滿RAM,一旦RAM滿了,事情就會變慢,將內存分頁到磁盤開始發生,基本上一切都停止工作,包括任何命令你目前正在運行(即Robocopy)。總的來說,因爲你處理的是數百萬行,所以我的建議是把它寫到磁盤上,因爲你的結果很可能會佔用相當多的空間,遠遠超過一個變量「應該」。

現在,在詳細說明程序如何操縱內存中的位之後,這一切並不重要,因爲花在寫入磁盤上的時間與時間相比非常小它需要處理所有的文件。

如果您正在處理1,000,000個文件,並且您以很快的速度處理它們,例如每秒處理1,000個文件,則需要1000秒才能處理。這意味着它需要16分鐘才能完成所有文件。

如果讓我們說寫入磁盤是不好的,並且可以讓您每秒處理5個文件,那麼995個文件將只運行5秒。 5秒是0.5%的影響,與運行整個過程所花費的時間相比毫無意義。

寫入變量會比寫入磁盤更麻煩。

+1

您能否提供一個聲明變量用於存儲少於10MB數據的源? –

+0

這是我自己的個人限制,因爲技術上.NET對象的大小可以高達2 GB。這並不是說我反對有大的變數,更重要的是評估這是否是「正確」的做事方式。變量用於處理數據,並不意味着永久存儲數據。所以諸如記錄你想要存儲數據的地方,實際上不應該存在它應該被存儲到磁盤的變量中。當你想處理數據時,最好從文件中逐行處理,然後將整個文件加載到內存中,然後對其進行處理。 – HAL9256