.net 通过首先对每个文件中具有1200万条记录的2个Csv文件进行排序来比较它们,会出现内存不足异常

0qx6xfy6  于 2022-12-05  发布在  .NET
关注(0)|答案(1)|浏览(80)

我试图比较两个Csv文件,每个文件中有1200万条记录,在比较文件之前,我想按升序排序,然后比较它们。我已经尝试了下面的代码,但它给出了内存不足异常。

public void SortCsv(string originalPath1, string originalPath2)
        {
            var lines1 = File.ReadLines(originalPath1, Encoding.Default);
            var sorted1 = lines1.Skip(1).OrderBy(row => row).Select(row => row).ToList();
            
            var lines2 = File.ReadLines(originalPath2, Encoding.Default);
            var sorted2 = lines2.Skip(1).OrderBy(row => row).Select(row => row).ToList();

            var extraFiles1Csv = sorted1.Except(sorted2, StringComparer.CurrentCultureIgnoreCase);
            var extraFiles2Csv = sorted2.Except(sorted1, StringComparer.CurrentCultureIgnoreCase);

            if(extraFiles1Csv.Count() > 0)
            foreach (var item in extraFiles1Csv)
                Console.WriteLine(item);
            if (extraFiles1Csv.Count() > 0)
            foreach (var item in extraFiles2Csv)
                Console.WriteLine(item);

            Console.WriteLine("Record is matched");
            Console.ReadKey();
        }

我期待它应该排序两个csv文件的数据,并比较他们,如果有任何不匹配,那么它应该返回不匹配的记录,否则它应该打印匹配的文件。

o2g1uqev

o2g1uqev1#

通过像这样使用linesX和sortedX,您可以将每个文件保存在内存2ce中,我认为您可以删除select
将其合并将使内存使用量减半

var lines1 = File.ReadLines(originalPath1, Encoding.Default).Skip(1).OrderBy(row => row).ToList();

此外,我会看看一些csv nuget包,如Sylvan.Data.csv来读取你的文件,这些包通常比你自己做的速度和内存处理要快。))

相关问题