读取大文本文件到datagridview进行过滤

时间:2010-10-20 08:13:31

标签: c# filtering

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

我正在寻找并找到一些解决方案,但我需要帮助决定什么是最适合我和实施(或者如果有其他的东西):

  1. 在后台加载数据并实时显示。我不确定该怎么做,我不知道如何处理此解决方案中的过滤。
  2. 也许以某种方式升级streamreader?或编写自己的方法从文件中读取二进制读取器的行?
  3. 我在c#4.0中发现了一些关于内存映射的内容,但是我无法使用4.0。这个帮助功能有用吗?
  4. 感谢您的帮助


    好的,所以我正在实现Paging,我读取5k行文本文件,而不是单击按钮下一行等等。我正在使用BaseStream.Position来保存起始读数,但我想使用一些其他函数来保存行数,主要是我想使用方法从精确行开始读取但我找不到StreamReader的任何内容。有类似的东西吗?

1 个答案:

答案 0 :(得分:1)

  

在后台加载数据并实时显示。我不确定如何做到这一点,我不知道如何处理此解决方案中的过滤。

这没有用。它仍将在后台线程中消耗大量内存。

  

也许以某种方式升级streamreader?或者编写自己的方法从二进制读取器读取文件中的行?

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

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

public IEnumerable<string> ReadFile(int page, int linesPerPage, out totalLines)
{
    ...
}

此处SkipTake扩展方法可能会有所帮助。