在c#中并行读取一百万行的csv文件

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,如果行顺序不重要.