我有一個桌面應用程序驗證某些CSV文件。 我得到這個CSV文件,我需要根據多個業務規則進行解析和驗證。這些業務規則特別適用於每條記錄,或者他們可以檢查具有與文件中所有記錄有關的範圍的集成債券。該文件幾乎有800k條記錄。如何處理大量數據的解析(800k記錄)?
這裏是我如何處理目前的問題:
- 我上傳CSV文件,每行轉換爲自定義對象(for循環用在這裏),我最終存儲在列表中。這一點通常需要3到6秒,所以我不認爲這是一個問題。
- 我將列表傳遞給驗證程序類,由於StructureMap將所有業務規則作爲單獨的類獲取。
- 我遍歷業務規則。我的第一個業務規則拋出一個異常,這樣的:
的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.000行? –
@RomanoZumbé,因爲「業務規則...可以檢查具有與文件中所有記錄有關的範圍的集成債券」 – Evk
如果將它們存儲在列表中,則最多可處理N條記錄。墨菲法則要求您遲早會得到一份N + 1記錄的CSV文件。 SO的賠率爲100%。項目「>」屬性「>」生成「選項卡,取消選中」優先選擇32位「複選框。你不喜歡它。 –