簡體   English   中英

在 xml 文件中查找元素值的最佳/最快方法

[英]Best/Fastest way to find values of a element in a xml file

我的程序基本上做的是它搜索 xml 並返回那些在元素中具有特定值的文件名。

我想我必須先向您展示我的 xml,然后才能繼續:

 <DocumentElement>
   <Protocol>
     <DateTime>10.03.2003</DateTime>
     <Item>Date</Item>
     <Value />
   </Protocol>
   <Protocol>
     <DateTime>05.11.2020</DateTime>
     <Item>Status</Item>
     <Value>Ok</Value>
   </Protocol>
 </DocumentElement>

我有幾千個 xml 文件,它們具有這種精確的布局。 用戶可以使用以下方法獲取所有文件的列表:

public List<string> GetFiles(string itemValue, string element, string value)
{
    return compatibleFiles.Where(path => XmlHasValue(path, itemValue, element, value)).ToList();
}

並且此方法返回 xml 是否具有所需值:

private bool XmlHasValue(string filePath, string itemValue, string element, string value)
{
    try
    {
        string foundValue = XDocument.Load(filePath)
            .Descendants()
            .Where(el => el.Name == "Item" && el.Value == itemValue)
            .First()
            .Parent
            .Descendants()
            .Where(des => des.Name == element && des.Value == value)
            .First()
            .Value;
         return foundValue == value;
    }
    catch (Exception)
    {
        return false;
    }
}

compatibleFiles是一個列表,其中包含具有正確布局/格式(上面的 xml 代碼)的 xml 文件的所有路徑。 用戶向GetFiles方法提供以下內容:

  • itemValue -> 'Item' 元素應該具有的值,例如“狀態”
  • element -> 他想要檢查的元素的名稱(在同一個“協議”元素中),fE“值”或“日期”
  • value -> element元素的值,在我們的示例中為“Ok”

問題是,這些方法需要很長時間才能完成,而且我幾乎可以肯定有更好更快的方法來做我想做的事。 我不知道GetFiles可以更快,但XmlHasValue肯定可以。 以下是一些測試結果:

在此處輸入圖片說明

你們知道有什么更快的方法嗎? 這真的很有幫助。

更新

原來這一切都只是因為 IO 線程。 如果你有同樣的問題並認為你的代碼很糟糕,你應該首先檢查它是否只是一個使用所有 CPU 能力的線程。

正如@Sinatr 所提到的。 在調查性能時,分析應該始終是第一步。

關於什么需要時間的合理猜測是

  1. 輸入輸出
  2. 解析

可以通過獲得更快的磁盤或在 RAM 中緩存結果來改進 IO。 如果進行多次搜索,后者可能會大大提高性能,但會引入緩存無效等問題。

根據“ What is the best way to parse (big) XML in C# Code ”,XmlReader 是解析 xml 的最快方法。 這個博客建議 XmlReader 大約快 2.5 倍

如果您有多個文件,您也可以嘗試並行處理多個文件。 請記住,IO 主要是串行的,因此除非您的 SSD 可以比文件處理速度更快地傳輸數據,否則您可能一無所獲。

暫無
暫無

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

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