使用 FileHelperAsyncEngine 无一例外地崩溃
Use FileHelperAsyncEngine crashed with no exception
我正在使用 FileHelpers 引擎 FileHelperAsyncEngine<T>
。读取一个包含超过 500,000 行的大型 CSV 文件,我需要提取一些字段来填充一个 SHP 文件 (ArcGIS)。
但是当我使用 BeginReadFile
并尝试 select 一些数据时,应用程序毫无例外地崩溃,即使我已经完成了获取全局异常。但是没有任何异常,我打印了线程正在读取的 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];
}
}
}
}
}
我正在使用 FileHelpers 引擎 FileHelperAsyncEngine<T>
。读取一个包含超过 500,000 行的大型 CSV 文件,我需要提取一些字段来填充一个 SHP 文件 (ArcGIS)。
但是当我使用 BeginReadFile
并尝试 select 一些数据时,应用程序毫无例外地崩溃,即使我已经完成了获取全局异常。但是没有任何异常,我打印了线程正在读取的 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];
}
}
}
}
}