C# 将大文本文件读取到datagridview a筛选

C# 将大文本文件读取到datagridview a筛选,c#,filtering,C#,Filtering,我需要逐行读取文本文件(服务器上的日志文件),它们很大(大约150-200MB)。我正在使用StreamReader,它非常适合12MB这样的“小”文件,但不适合这么大的文件。过了一段时间,它被加载并显示在我的DataGridView中,但它的内存很大。我在这个DataGridView上使用bindingSource.Filter(比如textbox,当用户写字母时,它会过滤一列比较字符串,不会在textbox中显示没有字母的行等等),对于大文件也没用。所以我想问你什么是对我最好的解决方案 我一

我需要逐行读取文本文件(服务器上的日志文件),它们很大(大约150-200MB)。我正在使用StreamReader,它非常适合12MB这样的“小”文件,但不适合这么大的文件。过了一段时间,它被加载并显示在我的DataGridView中,但它的内存很大。我在这个DataGridView上使用bindingSource.Filter(比如textbox,当用户写字母时,它会过滤一列比较字符串,不会在textbox中显示没有字母的行等等),对于大文件也没用。所以我想问你什么是对我最好的解决方案

我一直在寻找并找到一些解决方案,但我需要帮助来决定什么对我来说是最好的,以及如何实施(或者如果有其他事情):

  • 在后台加载数据并实时显示。我真的不知道如何做到这一点,我也不知道在这个解决方案中如何进行过滤
  • 也许升级一下你的阅读器?还是编写自己的方法,用二进制读取器从文件中读取行
  • 我在c#4.0中找到了一些关于内存映射的东西,但我不能使用4.0。此帮助功能是否有帮助
  • 谢谢你的帮助


    好的,所以我实现了分页,我读取了5k行的文本文件,而不是单击按钮“下一行”后读取的文本文件,依此类推。我正在使用BaseStream.Position来保存起始读数,但我想使用一些其他功能来保存行数,主要是我想使用方法从精确的行开始读取,但我找不到StreamReader的任何内容。有这样的事吗

    在后台加载数据并实时显示。我真的不知道如何做到这一点,我也不知道如何在这个解决方案中进行过滤

    这没有帮助。它仍然会在后台线程中消耗大量内存

    也许升级一下你的阅读器?还是编写自己的方法,用二进制读取器从文件中读取行

    仍然没有帮助,一旦您将整个文件读入内存,它将消耗内存

    我想你明白了。不要将整个文件加载到内存中。只加载它的块。使用分页。您无法在单个屏幕上显示200MB的数据,因此只能加载需要在屏幕上显示的部分。因此,基本上您需要实现以下功能:

    public IEnumerable<string> ReadFile(int page, int linesPerPage, out totalLines)
    {
        ...
    }
    
    public IEnumerable可读文件(int-page、int-linesPerPage、out-totalines)
    {
    ...
    }
    
    这里的方法和扩展方法可能会有所帮助

    在后台加载数据并实时显示。我真的不知道如何做到这一点,我也不知道如何在这个解决方案中进行过滤

    这没有帮助。它仍然会在后台线程中消耗大量内存

    也许升级一下你的阅读器?还是编写自己的方法,用二进制读取器从文件中读取行

    仍然没有帮助,一旦您将整个文件读入内存,它将消耗内存

    我想你明白了。不要将整个文件加载到内存中。只加载它的块。使用分页。您无法在单个屏幕上显示200MB的数据,因此只能加载需要在屏幕上显示的部分。因此,基本上您需要实现以下功能:

    public IEnumerable<string> ReadFile(int page, int linesPerPage, out totalLines)
    {
        ...
    }
    
    public IEnumerable可读文件(int-page、int-linesPerPage、out-totalines)
    {
    ...
    }
    

    和扩展方法在这里可能会有所帮助。

    我应该如何处理过滤?正如我提到的,我应该再次加载带有比较字符串的文件,对吗?当用户更改(添加、删除)字母时,我应该再次从加载文件开始,并控制要显示的行和不显示的行。您可以在ReadFile函数中添加一个额外的参数,该参数将允许您筛选行。我应该如何处理筛选?正如我提到的,我应该再次加载带有比较字符串的文件,对吗?当用户更改(添加、删除)字母时,我应该再次从加载文件开始,并控制显示哪一行和不显示哪一行?您可以在ReadFile函数中添加一个额外的参数,该参数允许您过滤行。