【问题标题】:Why does ReadAllLines work in WPF but not in ConsoleApp为什么 ReadAllLines 在 WPF 中有效,但在 ConsoleApp 中无效
【发布时间】:2014-11-13 20:11:54
【问题描述】:

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

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

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

【问题讨论】:

  • 你怎么知道它有效?你真的进入了 WPF 应用程序中的 foreach 循环吗?
  • 说真的,对于这么大的文件,最好是流式传输而不是一次性处理所有文件
  • 我进入了 foreach 循环,我什至可以显示数据网格中的所有行,正如我所说,我知道不要在这么大的文件上使用 ReadAllLines。
  • 元评论:我觉得这个问题很难判断。您声称 RealAllLines 用于大文件在 WPF 中有效,但在控制台应用程序中无效。除了您的声明外,我们这里没有显示该问题的示例程序(包括生成大型输入文件的程序),即我们无法重现该问题。如果您添加了一个最小的 WPF 应用程序、一个最小的控制台应用程序和一个生成 730 MB 输入文件的小程序,这将导致控制台程序出现问题,您的问题会好得多。

标签: c# csv file.readalllines


【解决方案1】:

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

将项目更改为 64 位。

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2011-03-12
    • 2015-09-12
    • 2011-07-19
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多