2012-11-03 69 views
1

我正在尋找在Python 2.x中編寫腳本來掃描物理驅動器(物理驅動器而非邏輯驅動器)的大小範圍內的特定字符串(聊天工件)。我有我的頁眉和頁腳的字符串,所以我只是想知道如何最好掃描驅動器?我擔心的是,如果我將它分解爲250MB塊,並在解析頁眉和頁腳之前將其讀取到RAM中,那麼它可能是頁眉,但頁腳處於下一個250MB塊。從物理驅動器中提取字符串

因此,本質上,我想掃描PhysicalDevice0中以「ABC」開始並以「XYZ」結尾的字符串,並從中複製所有內容。我不確定是否將數據掃描爲ascii或Hex。

隨着驅動器變得越來越大,我期待以儘可能最快的方式做到這一點。

有什麼建議嗎?

+0

你在做什麼平臺? – iTayb

+0

它基本上是緩衝讀取,可能你想避免檢查你是否在每個讀取一個字節的緩衝區的末尾。你可以例如讀取250 MB,掃描直到找到end_of_buffer - length_of_the_string,然後加載下一個250 MB - 字符串的長度(所以,讀數與N字節重疊,其中N是您正在搜索的字符串的長度)。在邊界上需要特別小心:如果部分匹配正在運行,則「延遲」下一個(重疊)塊的加載,或者如果完成匹配,則返回Found找到 – ShinTakezou

+0

我希望它在多個平臺上運行如果可能的話,但大多數計算機將運行Windows 7 x64 – thefragileomen

回答

1

您的問題可以表述爲「我如何在一個很長的文件中搜索沒有行結構。」如果您一次讀取一行一行的面向行的文本,它與您所做的沒有什麼不同:假設您正在逐塊讀取文本文件,但有一個面向行的正則表達式用於搜索;你會搜索到最後的完整的在你已閱讀的區塊中的行,然後保持到最後一個不完整的行,並閱讀另一個區塊來擴展它。所以,你不會重新開始每個新塊的讀取。把它想成一個滑動窗口;您只會提前放棄您完全可以搜索的部分。

在此處做同樣的事情:編寫代碼,以便匹配的字符串永遠不會碰到緩衝區的邊緣。例如,如果您要搜索的標題長度爲100個字節:讀取一段文本;檢查模塊中是否出現完成模式;在當前塊結束之前將您的閱讀窗口提前至100個字節,並在其後添加一個新塊的文本值。現在您可以搜索標題,而不必擔心錯過標題。一旦找到它,就會提取文本,直到看到停止模式(頁腳)。不管它是在同一個塊還是在五個塊之後:你的代碼應該知道它處於提取模式,直到看到停止模式。