2012-01-11 70 views
0

我需要提高桌面應用程序(.net)的性能,該應用程序旨在讀取數據庫並基於XBRL(可擴展商業報告語言)創建xml文件。它使用UBMatrix創建XBRL分類標準。.net 3.5桌面應用程序和SQL Server 2008性能優化

如果特定數據的大小很小,應用程序可以正常工作。但是,如果數據很大,應用程序將花費超過30分鐘來生成文件。客戶端數據總是很大/很大。所以應用程序需要更多時間來生成文件。

我的任務是優化應用程序以減少創建xml文件所花費的時間。當我檢查應用程序時,我發現應用程序正在以這種方式運行。

啓動

  • 創建連接到數據庫
  • 得到的第一組數據(此表(表1)過大)。並且查詢將圍繞15-30 K行返回的dataTable
  • for循環0到datatable.Rows.count
    • 檢查一些條件
    • 從數據庫獲取數據。 (這個表(table2)也比(table1)太大
    • 發送數據形成xbrl並寫入xml(這是由第三方應用程序UBMatrix完成的)不能編輯創建xbrl的代碼-xml文件。

同樣有3〜4組數據,將處理

在我的觀察,我們能夠避免DB for循環調用。循環之前獲取的所有數據。當我檢查了查詢,有子查詢,不存在(select * from table)等可以替換爲連接,不存在(從表中選擇1)

但是應用程序仍然需要循環處理。我也在考慮使用線程,以便我可以根據數據的大小創建線程並同時處理它。

  • 如果有100 rows.there將100項,以XML文件(XBRL)
  • 所以我會讓50,50和兩個線程,這將產生兩個xml文件運行。最後我會將兩個文件合併成一個xml文件。

因此,第0個問題和第50個問題的處理可以同時開始。目前在For循環中,第0個將處理,第99個將在最後處理。我不確定這個想法。任何可以提出/分享你的想法。任何幫助將不勝感激。在此先感謝

回答

0

不是一個真正的答案,只是一個非常大的評論:

我會刪除你的計劃,多線程,除非UBmatrix公司API稱它是線程安全的,所有的光盤的思想I/O當生成XBRL時。

讓您的應用程序對內存使用進行配置嗎?我正在考慮加載的15-30K行數據,然後可能在處理和寫入文件之前轉移到對象模型中。如果你開始達到2GB的限制(32位),那麼你的進程將進行大量的分頁,這是非常流利的。

這個選擇是否可能? 預先生成數據到文件,可能以xml格式。然後,希望UBMatrix有一個接受文件路徑和流數據的API,你可以傳遞文件數據的路徑。 (如果數據查詢長時間運行,這可能會增加速度)。

0

30分鐘30k查詢每秒只有16個查詢。這不是很多,除非查詢很昂貴。

爲了找出答案,運行SQL Profiler並檢查每個查詢的執行時間。與查詢的數量相乘。如果這相當接近30分鐘,如果您可以將所有這些查詢重寫爲聯接並將結果放入DictionaryILookup,那麼您很幸運。

如果你需要求助於多線程。檢查是否可以升級到.NET 4.然後,您可以在TPL中使用Parallel.ForEach或其他合適的方法來並行處理您的工作。

0

沒有看到代碼我不能告訴你正在使用什麼類的數據訪問,但從你提到的DataTable.Rows我假設你正在使用DataSet/DataTable。如果切換到使用IDataReaderCommandBehavior.SequentialAccess,則可以避免DataSet/DataTable附帶的大量不必要的開銷。

0

我建議分析器,但爲.NET應用程序。檢查大部分時間花在哪裏並攻擊那個地方。如果是從數據庫中獲取數據的調用,則可以查看數據庫並可能添加一些新的索引和/或重新設計查詢。如果它正在撥打UBMatrix,那麼除了向誰給你這個任務的人解釋外,你可以做的不多。但是在你放棄之前,你可以嘗試並行處理,首先確保UBMatrix是線程安全的,就像Simon指出的那樣。如果不是,或者你不能告訴你可以作爲單獨的AppDomain運行並行處理來模擬線程安全。儘管如此,這將花費資源和更復雜的代碼。並行處理只有在正常應用程序運行期間可以觀察到CPU使用率低於70%並且磁盤沒有被過度使用(請查看資源監視器),因此有足夠的資源可供使用。

如果使用了很多磁盤,另一種方法可能是檢查是否將xml文件寫入RAM驅動器會改善任何事情。

無論如何,從分析你的.NET應用程序開始 - 這應該給你一個很好的起點。這裏是一個免費的.NET分析器:http://www.eqatec.com/tools/profiler/