我有以下代码,它实际上将CSV序列化为对象。我尝试使用Foreach和Parallelism,但我得到了一点点好处。我想知道如何优化此代码以更好地利用并行处理功能。我有8GB内存的i7,并在csv字符串中处理1000-2000条记录。
private List<Summary> deserializeCSV(string pSource, int pageSize)
{
List<Summary> ret = new List<Summary>(pageSize);
string[] lines = pSource.Split(new char[] { '\n' });
Parallel.For(1, lines.Length - 1, i =>
{
string[] col = lines[i].Split(',');
ret.Add(new Summary
{
Complaint_Type = col[0],
Product = col[1],
ProductGroup = col[2],
Brand = col[3],
Each_UPC = col[4],
SUBJECTCATEGORY_DESC = col[5],
GROUP_DESC = col[6],
SUBGROUP_DESC = col[7],
SUBJECT_DESC = col[8],
State = col[9],
CITY = col[10],
FullZip = col[11],
Zip = col[12],
IssueDate = DateTime.Parse(col[13]),
ComplaintsCount = Single.Parse(col[14]),
Gender = col[15],
AgeBucket = col[16],
Population = Single.Parse(col[17]),
_RowID = int.Parse(col[18]),
_RowIDComp = int.Parse(col[19]),
ComplaintsCount_New = Single.Parse(col[20]),
Population_New = Single.Parse(col[21]),
Country = col[22],
_ID = long.Parse(col[23]),
C40_CODE = col[24]
});
});
return ret;
}
我观察到,如果我没有添加de-serilized对象[意味着而不是ret.Add(new Summary,var temp = new Summary)到我的可退回列表中(但只分配值),它给了我更好的性能。这个初始化List ret = new List(pageSize);还是别的什么?
修改-1 我的方案是我有一个包含内存页面的csv,我必须处理这些页面以从中提取一些摘要信息。这是一项耗时的任务,我希望使用并行处理来优化处理时间。
答案 0 :(得分:2)
首先,该代码不是线程安全的。 如果 Parallel.For
决定使用多个线程(这是正确的,它也可能决定不这样做),你将有几个线程访问同一个列表,它本身不是线程安全的。例如,您应该使用ConcurrentBag<T>
。
其次,我认为这种工作不值得并行化。按顺序执行它需要多长时间?毫秒?你只是解析字符串和创建对象,没有昂贵的计算。