加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

ASP.net C#:如何使用File.ReadLines(fileName).GetEnumerator()

发布时间:2020-12-16 07:40:38 所属栏目:asp.Net 来源:网络整理
导读:我们正在尝试使用以下代码. public static int SplitFile(string fileName,string tmpFolder,Liststring queue,int splitSize = 100000) { int chunk = 0; if (!Directory.Exists(tmpFolder)) Directory.CreateDirectory(tmpFolder); using (var lineIterato
我们正在尝试使用以下代码.

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,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个文件时开始抛出“Out of memory exception”.

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

解决方法

因为它是一个巨大的文件,你应该读它BinaryReader的Seek和ReadBytes方法.

您可以看到一个简单的示例here.使用ReadBytes检查最后一行后,并以您阅读的特定行数写入流程文件.不要写你读的每一行,也不要把所有的数据保存在内存中.

剩下的就在你手中.

也许真的是那个When does File.ReadLines free resources

IEnumerable doesn’t inherit from IDisposable because typically,the class that implements it only gives you the promise of being enumerable,it hasn’t actually done anything yet that warrants disposal.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读