c#字符串数组内存不足

时间:2014-12-18 10:09:44

标签: c# arrays string out-of-memory

我尝试取2个txt文件并将file1 concat中每一行的行与file2中的每一行合并

实施例: 文件1:

a
b

file2的:

c
d

结果:

a c

a d

b c

b d

这是代码:

{
        //int counter = 0;


        string[] lines1 = File.ReadLines("e:\\1.txt").ToArray();
        string[] lines2 = File.ReadLines("e:\\2.txt").ToArray();

        int len1 = lines1.Length;
        int len2 = lines2.Length;

        string[] names = new string[len1 * len2];
        int i = 0;
        int finish = 0;
        //Console.WriteLine("Check this");
        for (i = 0; i < lines2.Length; i++)
        {
            for (int j = 0; j < lines1.Length; j++)
            {
                names[finish] = lines2[i] + ' ' + lines1[j];
                finish++;
            }
        }

        using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"E:\text.txt"))
        {
            foreach (string line in names)
            {
                // If the line doesn't contain the word 'Second', write the line to the file. 
                    file.WriteLine(line);
            }
        }
    }

我得到了这个例外:

  

“发生了'System.OutOfMemoryException'类型的未处理异常   在ConsoleApplication2.exe中“在这一行:

     

string [] names = new string [len1 * len2];

是否有其他方法可以合并这2个文件而不会出现OutOfMemoryException?

6 个答案:

答案 0 :(得分:2)

类似

using (var output = new StreamWriter(@"E:\text.txt"))
{
    foreach(var line1 in File.ReadLines("e:\\1.txt"))
    {
        foreach(var line2 in File.ReadLines("e:\\2.txt"))
        {
            output.WriteLine("{0} {1}", line1, line2);
        }
    }
}

除非行很长,否则应该避免使用OutOfMemoryException

答案 1 :(得分:1)

看起来你想要一个笛卡尔积而不是串联。不要将所有行加载到内存中,而是将ReadLinesSelectMany一起使用,这可能不会很快但会避免异常:

var file1 = File.ReadLines("e:\\1.txt");
var file2 = File.ReadLines("e:\\2.txt");

var lines = file1.SelectMany(x => file2.Select(y => string.Join(" ", x, y));
File.WriteAllLines("output.txt", lines);

答案 2 :(得分:0)

使用StringBuilder实例而不是连接字符串。字符串在.Net中是不可变的,因此对任何实例的每次更改都会创建一个新的,消耗可用的内存。 使名称成为StringBuilder []名称,并使用Append方法构造结果。

答案 3 :(得分:0)

如果您的文件很大(这是内存不足的原因),您不应该(从不)将完整的文件加载到内存中。特别是结果文件(size = size1 * size2)会变得非常大。 我建议使用StreamReader逐行读取输入文件 使用StreamWriter逐行编写结果文件。

使用这种技术,您可以处理大型文件(只要结果适合您的硬盘)

答案 4 :(得分:-1)

使用stringbuilder而不是通过&#34; +&#34;

附加

答案 5 :(得分:-1)

使用“列表名称”和“添加”组合行到列表。 所以你不需要分配内存。