2017-06-14 50 views
-2

我有一個桌面應用程序驗證某些CSV文件。 我得到這個CSV文件,我需要根據多個業務規則進行解析和驗證。這些業務規則特別適用於每條記錄,或者他們可以檢查具有與文件中所有記錄有關的範圍的集成債券。該文件幾乎有800k條記錄。如何處理大量數據的解析(800k記錄)?

這裏是我如何處理目前的問題:

  1. 我上傳CSV文件,每行轉換爲自定義對象(for循環用在這裏),我最終存儲在列表中。這一點通常需要3到6秒,所以我不認爲這是一個問題。
  2. 我將列表傳遞給驗證程序類,由於StructureMap將所有業務規則作爲單獨的類獲取。
  3. 我遍歷業務規則。我的第一個業務規則拋出一個異常,這樣的:

的CLR一直無法從COM上下文0xa4234fc8轉換爲COM上下文0xa42350f0 60秒。擁有目的地上下文/公寓的線程很可能要麼進行非抽水等待,要麼處理非常長的運行操作而不抽取Windows消息。這種情況通常會對性能產生負面影響,甚至可能導致應用程序無法響應或內存使用量不斷累積。爲了避免這個問題,所有的單線程單元(STA)線程都應該使用抽取等待原語(比如CoWaitForMultipleHandles),並在長時間運行的操作中定期抽取消息。

我明白這可以隱藏,但我不想隱藏錯誤,我想了解我能做些什麼來使代碼更有效。我已經消除了代碼中拋出的所有異常,並且它工作得更好。

對於每一個我跑業務規則中下面的代碼記錄:

var mandatoryFields = GetFieldsWithAttribute<MandaroryFieldAttribute>(package); 

foreach (var field in mandatoryFields) 
{ 
    var fieldValue = field.GetValue(package, null).ToString(); 

    if (!string.IsNullOrWhiteSpace(fieldValue)) 
     continue; 

    var errorMessage = GetErrorMessage(package.RowNumber, field.Name, 
     field.GetAttributeForPackage<CsvFieldNameAttribute>().Name); 

    if (FailedResults.Contains(errorMessage)) 
     continue; 

    FailedResults.Add(errorMessage); 
} 

因爲有很多領域 - 我決定來驗證使用自定義屬性,使這一過程更加通用的領域。 System.Reflection在兩個擴展方法中使用:GetAttributeForPackage和GetFieldsWithAttribute。

  1. 寫一個總結驗證的報告到文本文件。

正如我所看到的,問題在於我必須解析每條記錄,對於某條規則解析某條規則的所有記錄。

我沒有解析大量數據的經驗。任何人都可以提出如何處理這個問題的方法嗎?

+0

爲什麼不一行一行地閱讀文件,或者一束一行地閱讀文件,比如說1.000行? –

+0

@RomanoZumbé,因爲「業務規則...可以檢查具有與文件中所有記錄有關的範圍的集成債券」 – Evk

+1

如果將它們存儲在列表中,則最多可處理N條記錄。墨菲法則要求您遲早會得到一份N + 1記錄的CSV文件。 SO的賠率爲100%。項目「>」屬性「>」生成「選項卡,取消選中」優先選擇32位「複選框。你不喜歡它。 –

回答

0

有幾件事情,可以幫助你:

  • 既然你已經大的文件,我建議你使用Memory-mapped files 。這使程序員非常大的文件

    既然你有很多的工作記錄進行驗證,您可以考慮使用線程或並行編程(任務) 。這樣的執行將會更快, 。

    我想你正在使用StreamReader.ReadLine來讀取每個 行。

+0

其實我用File.ReadAllLines來讀取整個文件,然後用for循環轉換每一行。 –