簡體   English   中英

復制響應多個搜索詞的文件的最快方法是什么?

[英]What's the fastest way to copy files responsive to multiple search terms?

目前正在開發一個允許用戶輸入名稱/搜索詞列表和文件夾路徑的應用程序。 然后應用程序搜索每個短語並將任何響應文檔復制到 output 路徑。 重要的是要注意,通常使用包含 100GB 到幾 TB 的目錄,有時可能需要運行數千個搜索詞。

最初我只是使用 System.IO.GetFiles() function 為此,但我發現創建輸入路徑中所有文檔的數據表並在該數據表上運行我的搜索有更好的結果(見下文)。

//Constructing a data table of all files in the input path
foreach (var file in fileArray)
    {
        System.Data.DataRow row = searchTable.NewRow();
        row[1] = file;
        row[0] = System.IO.Path.GetFileName(file);
        searchTable.Rows.Add(row);
    }
 
//For each line inputted by the user, search the data table to find any responsive file names
foreach (var line in searchArray)
{
    
    for (int i = 0; i < searchTable.Rows.Count; i++)
    {
        if (searchTable.Rows[i][0].ToString().Contains(line))
        {
            string file = searchTable.Rows[i][1].ToString();
            string output = SwiftBank.CalculateOutputFilePath(outputPath,inputPath,file);
            System.IO.File.Copy(file, output);
        }
    }
}

我發現雖然這很有效,但它並沒有經過優化,而且對於大型數據集的運行速度非常慢。 顯然做了很多重復的工作,每個搜索詞都完整地搜索數據表。 想知道這里的人是否有更好的主意?

根據我的經驗,對數千個相當短的字符串執行少量包含查詢應該不到一秒鍾。 如果您在更大的數據集中搜索,例如搜索 100Gb 的內容,您應該查看一些更高級的庫,例如lucene

我建議改變一些事情

  • 使用常規列表而不是數據表。 List<(string filePath, string fileName)>這樣的東西會簡單得多,並且包含相同的信息
  • 一次對特定文件執行所有檢查,即重新排序循環,文件循環是外部循環。 這應該有助於緩存使用。

但是,絕大多數時間可能會花在復制文件上。 這比在幾 KB 的 memory 中進行一些簡單的搜索要慢很多數量級。 並行執行多個副本可能會有所收獲,因為 SSD 可能能夠在更高負載下提高吞吐量,但這可能只有在文件很小的情況下才是正確的。 您可以考慮替代復制,例如添加快捷方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM