Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么ReadAllLines在WPF中工作而在ConsoleApp中不工作_C#_Csv_File.readalllines - Fatal编程技术网

C# 为什么ReadAllLines在WPF中工作而在ConsoleApp中不工作

C# 为什么ReadAllLines在WPF中工作而在ConsoleApp中不工作,c#,csv,file.readalllines,C#,Csv,File.readalllines,我正在对读取CSV文件的不同方法进行基准测试,发现了一个“wierd”问题。问题在于,当我在控制台应用程序中使用此方法时: var lines = File.ReadAllLines(fileName); // OutOfMemoryException foreach (var line in lines) { //doing stuff } 我得到了一个OutOfMemoryException,但是当我在

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

        var lines = File.ReadAllLines(fileName); // OutOfMemoryException
        foreach (var line in lines)
        {
            //doing stuff
        }
我得到了一个OutOfMemoryException,但是当我在WPF项目中使用相同的方法时,它工作得很好。
我在上面测试的文件是730MB,我知道不能在更大的CSV文件上使用ReadAllLines,但为什么这个方法在WPF应用程序中有效,而在控制台应用程序中无效

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

将项目更改为64位


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

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


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

您怎么知道它有效?你真的在WPF应用程序中找到了foreach循环吗?真的,对于这么大的文件,最好是流式处理,而不是一次处理所有文件。我可以进入foreach循环,甚至可以显示datagrid中的所有行,正如我所说,我知道在这样大小的文件上不使用ReadAllLines。Meta-comment:我觉得这个问题很难判断。您声称用于大文件的
reallalllines
在WPF中有效,但在控制台应用程序中无效。除您的声明外,我们这里没有显示问题的示例程序(包括生成大型输入文件的程序),即我们无法重现问题。如果您添加一个最小的WPF应用程序、一个最小的控制台应用程序和一个生成730MB输入文件的小程序(该文件将导致控制台程序.Or file.ReadLines()中出现问题),您的问题会好得多。有一个相关的帖子。