2

我正在对读取 CSV 文件的不同方式进行一些基准测试,并发现了一个“奇怪”的问题。问题是当我在控制台应用程序中使用此方法时:

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

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

4

2 回答 2

5

您正在使用 32 位进程并遭受地址空间碎片的困扰。这意味着运行时无法分配足够的连续内存,尽管总共有足够的内存是可用的。WPF 可能只是倾向于具有更好的内存布局。

将项目更改为 64 位。

或者,使用File.ReadLines.

于 2014-09-19T09:18:54.930 回答
3

我怀疑您的 WPF 应用程序是在任何 CPU 上编译的,而您在 x32 目标 CPU 上控制台应用程序。如果您在 x64 机器上运行应用程序,WPF 应用程序可以使用比 x32 编译控制台应用程序更多的内存,后者被限制在大约 1.5 GB。

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

于 2014-09-19T09:21:12.667 回答