如何使用file . readlines (fileName). getenumerator()逐行读取20到200gb

本文关键字:读取 200gb 逐行 getenumerator readlines 何使用 fileName file | 更新日期: 2023-09-27 18:16:30

我们正在尝试下面的代码。

 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

。当前显示调试器中的值。

如何使用file . readlines (fileName). getenumerator()逐行读取20到200gb

因为它是一个巨大的文件,你应该阅读它的SeekReadBytes方法的BinaryReader

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

剩下的就看你了。

可能和那个When does File有关。ReadLines免费资源

IEnumerable不继承自IDisposable,因为通常情况下,实现它的类只给你一个可枚举的承诺,它实际上还没有做任何需要被处理的事情。