C# 如何对大量数据(800k记录)进行多次解析?

C# 如何对大量数据(800k记录)进行多次解析?,c#,.net,large-data,C#,.net,Large Data,我有一个验证特定CSV文件的桌面应用程序。 我得到了这个CSV文件,我需要根据多个业务规则对其进行解析和验证。这些业务规则可以特别适用于每个记录,也可以检查与文件中所有记录相关的范围的集成绑定。该文件大约有800k条记录长 以下是我目前如何处理这个问题: 我上传csv文件,并将每一行转换为一个自定义对象(此处使用for循环),最终存储在列表中。这一点通常需要3到6秒,所以我不认为这是个问题。 我将列表传递给一个验证器类,由于StructureMap,它将所有业务规则作为单独的类来获取 我反复浏览

我有一个验证特定CSV文件的桌面应用程序。 我得到了这个CSV文件,我需要根据多个业务规则对其进行解析和验证。这些业务规则可以特别适用于每个记录,也可以检查与文件中所有记录相关的范围的集成绑定。该文件大约有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);
    }
    
    var mandatoryFields=GetFieldsWithAttribute(包);
    foreach(mandatoryFields中的变量字段)
    {
    var fieldValue=field.GetValue(包,null).ToString();
    如果(!string.IsNullOrWhiteSpace(fieldValue))
    继续;
    var errorMessage=GetErrorMessage(package.RowNumber,field.Name,
    field.GetAttributeForPackage().Name);
    if(FailedResults.Contains(errorMessage))
    继续;
    FailedResults.Add(错误消息);
    }
    
    因为有很多字段-我决定使用自定义属性验证字段,以使流程更通用。反射在两个扩展方法中使用:GetAttributeForPackage和GetFieldsWithAttribute

  • 将总结验证的报告写入文本文件
  • 在我看来,问题是我必须解析每一条记录,对于某些规则,解析所有记录


    我没有解析大量数据的经验。有人能建议一种方法来处理这个问题吗?

    有几件事可以帮助你:

    • 既然你有大文件,我建议你用 。这使程序员能够处理非常大的文件

      <>因为你有大量的记录要验证,你可以考虑使用 线程或并行编程(任务)。这样执行将 快点

      我猜您正在使用StreamReader.ReadLine来阅读 线路


    为什么不逐行或成串(比如说,1000行)读取文件?@RomanoZumbé因为“业务规则……可以检查与文件中所有记录相关的范围的集成绑定”,如果将它们存储在列表中,则最多可以处理N条记录。墨菲定律要求你迟早会得到一个包含N+1条记录的CSV文件。这样的几率是100%。项目>属性>构建选项卡,取消选中“首选32位”复选框。你不喜欢它。你能找出一个抛出错误的规则吗?只要问题是抽象的,你就会得到“抽象”的答案。尝试改变处理数据的方式:1)不要将所有数据都保存在内存中,对其进行索引或使用易于索引的中间格式(例如数据库),2)如果可以加载所有数据,则可能只需要使用更少的内存。详细信息很重要,但您尚未提供。实际上,我使用File.ReadAllLines读取整个文件,然后使用for循环转换每一行。