簡體   English   中英

我如何使我的程序更具響應性? (加載至少200個文件的程序)-我可能有1個主意

[英]how can i make my program more responsive? (program that loads atleast 200 files) - i might have 1 idea

首先-我想對我的英語水平不好意思表示歉意。

我正在構建一個使用大量文件的程序。 我有很多foreach循環,這些循環遍歷硬盤和那些文件(至少200個文件-平均每個文件600字節),該循環使用XPath搜索文件中的值(這些文件當然是XML文件)

我需要找到一種使程序更具響應性的方法-我想到了以下一種方法:計算機內存的加載速度比計算機硬盤快-並且我認為-也許我應該將這些文件加載​​到內存中並進行循環內存而不是循環硬盤..順便說一句,如果有人能告訴我(通過硬盤)計算機內存比感謝內存快多少

在先進的感謝。

如果有人聽不懂我的英語,我會嘗試再次解釋

我想到的最好的方法是C#4.0中的PLINQ 對這些XML文件進行分組,並使用LINQ-to-XML並行查詢它們。 以下是一個簡單的示例,該示例將所有xml文件加載到C:\\ xmlFolder中,然后選擇包含名稱為“ key”的元素的那些文檔。

List<XDocument> xmls = Directory.EnumerateFiles(@"C:\XmlFolder").AsParallel()
                          .Select(path => XDocument.Load(path))
                          .Where(doc => doc.Descendants()
                                           .Any(ele => ele.Name.Equals("key")))
                          .ToList(); 

您應該在另一個線程中解析XML文件,並使用所需的信息創建對象,這樣您就可以立即訪問該信息。

定義“響應式”。 您是要讓UI提示繼續發生,還是要讓U​​I在處理文件時繼續做其他事情?

前者很簡單,您可以在循環中偶爾拋棄Application.DoEvents() 這將提示用戶界面執行任何正在等待的提示(例如繪制窗口等)。

后者將涉及多線程。 深入研究要比在一兩段中講到的要復雜一些,但是一些Google搜索“ c#.net多線程教程”應該會產生大量結果。 如果您不熟悉多線程提供的基本概念,那么我可以進一步解釋。

使用BackgroundWorker或ThreadPool為I / O產生多個線程,然后將數據讀入Queue(這是假設數據的總大小不是太大)。 讓另一個線程讀取該隊列,並執行內部xPath邏輯以從這些文件中提取所需的內容。

本質上,可以將其視為Producer / Consumer設計模式的實例,其中I / O讀取器線程是生產者,而XPath邏輯線程是使用者。

隊列中對象的類型可能只是一個字節數組,但我建議您使用一個自定義C#類,其中包含字節數組以及一些文件元數據,以防您出於任何原因而需要它。

您可以使用數據庫來存儲XML文件,它將比您當前的架構更快,更安全,更可靠。 您可以建立索引,啟用並發訪問,支持XQuery / Xpath以及更多“加號”。

如果只有XML文件,則可以考慮使用本機XML數據庫;如果還有其他類型,則可以考慮啟用XML的DBMLS(例如Oracle或DB2)。

暫無
暫無

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

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