为什么ReadAllLines在WPF中有效,而在ConsoleApp中无效

本文关键字:而在 ConsoleApp 无效 有效 WPF 为什么 ReadAllLines | 更新日期: 2023-09-27 18:23:46

我正在对读取CSV文件的不同方法进行一些基准测试,发现了一个"wierd"问题。问题是,当我在控制台应用程序中使用这种方法时:

        var lines = File.ReadAllLines(fileName); // OutOfMemoryException
        foreach (var line in lines)
        {
            //doing stuff
        }

我得到一个OutOfMemoryException,但当我在WPF项目中使用相同的方法时,它工作得很好。我测试的文件是730MB,我知道不要在更大的CSV文件上使用ReadAllLines,但为什么这种方法在WPF应用程序中有效,而在控制台应用程序中无效?

为什么ReadAllLines在WPF中有效,而在ConsoleApp中无效

您使用的是一个32位进程,并且地址空间碎片化。这意味着运行时无法分配足够的连续内存,尽管总的来说,有足够的内存是空闲的。WPF可能只是倾向于拥有更好的内存布局。

将项目更改为64位。

或者,使用File.ReadLines流式传输文件。

我怀疑您的WPF应用程序在Any CPU上编译,而您的控制台应用程序在x32目标CPU上。如果在x64计算机上运行应用程序,与x32编译的控制台应用程序相比,WPF应用程序可能会使用更多的内存,后者被限制在大约1.5 GB。

此外,我建议改变你的方法,如果可能的话,不要一次处理整个文件。

相关文章: