使用FileHelperAsyncEngine不会异常崩溃

问题描述:

我正在使用FileHelpers引擎FileHelperAsyncEngine<T>。读取超过500,000行的大型CSV文件,我需要提取一些字段以填充SHP文件(ArcGIS)。使用FileHelperAsyncEngine不会异常崩溃

但是,当我使用BeginReadFile并尝试选择一些数据时,应用程序崩溃没有任何异常,即使我已经做了全局异常。但没有什么不寻常的,我打印线程正在读取的CSV行。

当程序崩溃时,日志文件中的最后一行每次都不相同。

这里是我的代码:

1.Method使用FileHelpersEngine

public Dictionary<int, double> FetchByStepIndex(int stepindex) 
{ 
    try 
    { 
     using (var engine = new FileHelperAsyncEngine<Mike2DDynamicData>()) 
     { 
      using (engine.BeginReadFile(CsvPath)) 
      { 
       var temp=new Dictionary<int, double>(); 
       foreach (var itemData in engine) 
       { 
        if (itemData.StepIndex != stepindex) continue; 
        temp.Add(itemData.ElementID,double.Parse(itemData.TotalWaterDepth)); 
        LogHelper.WriteLog(
         itemData.StepIndex + "_" + itemData.ElementID + "_" + itemData.TotalWaterDepth, 
         LogMessageType.Info); 
       } 
       /* The codes when not debugging like ↓ 
       var temp = engine.Where(w => w.StepIndex == stepindex) 
        .Select(s => new { s.ElementID, s.TotalWaterDepth }) 
        .ToDictionary(d => d.ElementID, d => d.TotalWaterDepth); 
        */ 
       engine.Close(); 
       return temp; 
      } 
     } 
    } 
    catch (FileHelpersException e) 
    { 
     throw e; 
    } 
} 

2.Class:Mike2DDynamicData:

[DelimitedRecord(",")] 
[IgnoreFirst] 
public class Mike2DDynamicData 
{ 
    public int StepIndex; 

    [FieldNullValue(typeof(DateTime),"2017-1-1 00:00:00")] 
    [FieldConverter(ConverterKind.Date,"yyyy-MM-dd HH:mm:ss")] 
    public DateTime Time; 
    public int ElementID; 

    [FieldValueDiscarded] 
    public string SurfaceElevation; 

    public string TotalWaterDepth; 

    [FieldValueDiscarded] public string CurrentSpeed; 
} 

为您简单的CSV文件,这是不值得的麻烦使用第三部分的DLL。只需自己编写代码即可。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.csv"; 
     static void Main(string[] args) 
     { 
      new Mike2DDynamicData(FILENAME); 
     } 
    } 
    public class Mike2DDynamicData 
    { 
     public static List<Mike2DDynamicData> data = new List<Mike2DDynamicData>(); 


     public int StepIndex; 

     public DateTime Time; 
     public int ElementID; 

     public string SurfaceElevation; 

     public string TotalWaterDepth; 

     public string CurrentSpeed; 

     public Mike2DDynamicData() { } 
     public Mike2DDynamicData(string filename) 
     { 

      StreamReader reader = new StreamReader(filename); 

      string inputline = ""; 
      int lineNumber = 0; 
      while((inputline = reader.ReadLine()) != null) 
      { 
       if (++lineNumber > 1) 
       { 
        string[] splitArray = inputline.Split(new char[] { ',' }); 

        Mike2DDynamicData newRow = new Mike2DDynamicData(); 
        data.Add(newRow); 

        newRow.StepIndex = int.Parse(splitArray[0]); 
        newRow.Time = DateTime.Parse(splitArray[1]); 
        newRow.ElementID = int.Parse(splitArray[2]); 
        newRow.SurfaceElevation = splitArray[3]; 
        newRow.TotalWaterDepth = splitArray[4]; 
        newRow.CurrentSpeed = splitArray[5]; 

       } 
      } 
     } 



    } 

} 
+0

其实,我需要使用多个线程同时读取 – Moriarty

+0

如果我读到内存中的所有数据,它可能太large.Because会有不止一个CSV文件,并和这些文件可能比大2GB甚至10GB .... – Moriarty

+0

然后只需制作多个Mike2DDyamicData类的实例。你怎么能从一个文件同时读取。你有与FileHelpersEngine相同的问题。你甚至不知道该库实际上在做什么。至少在我的代码中,您可以正确处理线程。 – jdweng