我们正在尝试使用以下代码。

 public static int SplitFile(string fileName, string tmpFolder, List<string> queue, int splitSize = 100000)
    {
        int chunk = 0;
        if (!Directory.Exists(tmpFolder))
            Directory.CreateDirectory(tmpFolder);
        using (var lineIterator = File.ReadLines(fileName).GetEnumerator())
        {
            bool stillGoing = true;
            for (chunk = 0; stillGoing; chunk++)
            {
                stillGoing = WriteChunk(lineIterator, splitSize, chunk, tmpFolder, queue);
            }
        }
        return chunk;
    }

    private static bool WriteChunk(IEnumerator<string> lineIterator,
                                   int splitSize, int chunk, string tmpFolder, List<string> queue)
    {
        try
        {

            //int tmpChunkSize = 1000;
            //int tmpChunkInc = 0;
            string splitFile = Path.Combine(tmpFolder, "file" + chunk + ".txt");

            using (var writer = File.CreateText(splitFile))
            {
                queue.Add(splitFile);
                for (int i = 0; i < splitSize; i++)
                {
                    if (!lineIterator.MoveNext())
                    {
                        return false;
                    }
                    writer.WriteLine(lineIterator.Current);

                }
            }

            return true;
        }
        catch (Exception)
        {

            throw;
        }

    }

它创建了大约 36 个文本文件(大约 800 MB),但是在 lineIterator.MoveNext() 处创建第 37 个文件时开始抛出“内存不足异常”。

而 lineIterator.Current 显示调试器中的值。

最佳答案

由于它是一个巨大的文件,因此您应该阅读 BinaryReader 的 SeekReadBytes 方法。

你可以看到一个简单的例子 here 。使用 ReadBytes 后,检查最后的新行并将进程文件写入您读取的一定数量的行中。不要写你读到的每一行,也不要把所有的数据都保存在内存中。

剩下的就在你的手中。

也许它与那个人有关 When does File.ReadLines free resources

关于c# - ASP.net C# : How to read 20 to 200 GB file line by line using File. ReadLines(fileName).GetEnumerator()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16898265/

10-10 20:47