Nex*_*eer 3 c# parallel-processing performance multithreading
我有一个包含超过1百万行数据的CVS文件.我打算并行阅读它们以提高效率.我可以做以下的事情,还是有更有效的方法?
namespace ParallelData
{
public partial class ParallelData : Form
{
public ParallelData()
{
InitializeComponent();
}
private static readonly char[] Separators = { ',', ' ' };
private static void ProcessFile()
{
var lines = File.ReadLines("BigData.csv");
var numbers = ProcessRawNumbers(lines);
var rowTotal = new List<double>();
var totalElements = 0;
foreach (var values in numbers)
{
var sumOfRow = values.Sum();
rowTotal.Add(sumOfRow);
totalElements += values.Count;
}
MessageBox.Show(totalElements.ToString());
}
private static List<List<double>> ProcessRawNumbers(IEnumerable<string> lines)
{
var numbers = new List<List<double>>();
/*System.Threading.Tasks.*/
Parallel.ForEach(lines, line =>
{
lock (numbers)
{
numbers.Add(ProcessLine(line));
}
});
return numbers;
}
private static List<double> ProcessLine(string line)
{
var list = new List<double>();
foreach (var s in line.Split(Separators, StringSplitOptions.RemoveEmptyEntries))
{
double i;
if (Double.TryParse(s, out i))
{
list.Add(i);
}
}
return list;
}
private void button2_Click(object sender, EventArgs e)
{
ProcessFile();
}
}
}
Run Code Online (Sandbox Code Playgroud)
ken*_*n2k 10
我不确定这是个好主意.根据您的硬件,CPU不会成为瓶颈,磁盘读取速度将会是.
另一点:如果您的存储硬件是磁性硬盘,那么磁盘读取速度与文件在磁盘中的物理存储方式密切相关; 如果文件没有碎片(即所有文件块都按顺序存储在磁盘上),如果按顺序逐行读取,则性能会更好.
一种解决方案是一次读取整个文件(如果你有足够的内存空间,100万行应该没问题)使用File.ReadAllLines,将所有行存储在字符串数组中,然后处理(即使用string.Split...等解析). )在你的Parallel.Foreach,如果行顺序不重要.
| 归档时间: |
|
| 查看次数: |
10318 次 |
| 最近记录: |