当前位置: 首页 > 编程语言 > C#

BestStrategiesforImplementingaLargeTextFileReaderSharing

时间:2023-04-10 14:07:18 C#

BestStrategiesforImplementingaLargeTextFileReader我们有一个应用程序,它把它的处理步骤记录到一个文本文件中。使用这些文件来分析实施和测试期间的问题。每个文件的大小不得超过10MB,最多可包含100,000行文本。目前,对这些日志的分析是通过打开文本查看器(Notepad++等)并根据问题查找特定字符串和数据来完成的。我正在构建一个有助于分析的应用程序。它将使用户能够阅读文件、搜索、突出显示特定字符??串以及与隔离相关文本相关的其他特定操作。这些文件将不会被编辑!在尝试一些概念时,我立即发现TextBox(或RichTextBox)不能很好地处理大文本的显示。我设法使用具有可接受性能的DataGridView实现查看器,但该控件不支持特定字符串的颜色突出显示。我现在想将整个文本文件作为字符串保存在内存中,并且只在RichTextBox中显示数量非常有限的记录。对于滚动和导航,我想添加一个单独的滚动条。这种方法的一个问题是如何从存储的字符串中获取特定行。如果有人有任何想法可以突出我的方法的问题,那么谢谢。我建议将整个内容加载到内存中,但作为字符串集合而不是单个字符串。这很容易做到:string[]lines=File.ReadAllLines("file.txt");然后,您可以使用LINQ搜索匹配行,轻松显示它们等。这是一种在具有多核的现代CPU上可以很好地扩展的方法。您创建一个迭代器块来生成文本文件中的行(如果需要,还可以生成多个文本文件):返回streamReader.ReadLine();然后使用PLINQ并行搜索行。如果您有现代CPU,这样做可以大大加快搜索速度。GetLines(文件名).AsParallel().AsOrdered().Where(line=>...).ForAll(line=>...);您在Where中提供一个谓词来匹配您需要提取的行。然后,您向ForAll提供一个操作,将行发送到最终目的地。这是您需要执行的操作的简化版本。您的应用程序是一个GUI应用程序,您不能在主线程上执行搜索。您必须为此启动后台任务。如果您希望此任务可取消,则需要在GetLines方法的while循环中检查取消标记。ForAll将调用线程池中线程的操作。如果要将匹配行添加到UI控件,则需要确保在UI线程上更新此控件。根据您使用的UI框架,有不同的方法可以执行此操作。此解决方案假定您可以通过对文件执行一次前向传递来提取所需的行。如果您需要根据用户输入进行多次传递,您可能希望将文件中的所有行缓存在内存中。10MB的缓存并不多,但假设您决定搜索多个文件。1GB的缓存甚至可以让一台强大的计算机不堪重负,但使用更少的内存和更多的CPU,因为我建议您可以在现代台式PC上在合理的时间内搜索非常大的文件。我想当一个人拥有数GB的RAM时,他自然会倾向于“将整个文件加载到内存中”的路径,但是这里有没有人对这个问题的肤浅理解感到满意?当这个人想要加载一个4GB的文件时会发生什么?(是的,可能不太可能,但是编程通常是关于扩展抽象的,而将整个事情加载到内存中的快速修复是不可扩展的。)当然,存在竞争压力:你是否需要昨天的解决方案,或者你是否有足够的时间深入研究问题并学习新知识?该框架还通过将块模式文件呈现为流来影响您的思维……您必须检查流的BaseStream.CanSeek值,如果是,则访问BaseStream.Seek()方法以进行随机访问。不要误会我的意思,我非常喜欢.NET框架,但我看到一个建筑工地,一群“木匠”无法在框架上盖房子,因为空气压缩机坏了,他们不知道如何使用锤子。打蜡,打蜡,授人以渔等等。所以,如果你有时间,看看推拉窗。您可以通过使用内存映射文件(让框架/操作系统管理滑动窗口)以简单的方式完成此操作,但有趣的解决方案是自己编写。基本思想是,您一次只能将文件的一小部分加载到内存中(在您的界面中可见的文件部分,两侧可能有一个小缓冲区)。当您在文件中向前移动时,可以保存每行开头的偏移量,以便您可以轻松地查找文件的任何较早部分。是的,这对性能有影响……欢迎来到现实世界,在现实世界中,人们面临着各种要求和约束,必须在时间和内存利用率之间找到可接受的平衡点。这就是编程的乐趣……找出实现目标的各种方式,并了解各种路径之间的权衡。这就是你如何超越办公室里那个把每个问题都视为钉子的人的技能水平,因为他只知道如何使用锤子。[/growl]我建议使用.NET4中的MemoryMappedFile(或通过以前版本中的DllImport)来仅处理屏幕上可见的一小部分文件,而不是浪费内存和时间来加载整个文件。以上就是《C#学习教程:实现大文本阅读器的最佳攻略》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: