2010-10-20 74 views
1

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

我一直在寻找并找到了一些解决方案,但我需要帮助决定对我来说,用什么实现最好的(或者如果有别的东西):在后台

  1. 加载数据并显示实时他们。我不确定如何做到这一点,我不知道如何处理这个解决方案。
  2. 也许以某种方式升级streamreader?或者用二进制阅读器编写自己的文件读取方法?
  3. 我在c#4.0中发现了一些关于内存映射的内容,但是我不能使用4.0。这可以帮助功能帮助吗?

感谢您的帮助


好了,所以我实现分页和我读5K线的文本文件不是点击按钮旁边线等之后。我正在使用BaseStream.Position来保存起始读数,但我想使用其他一些节省行数的函数,主要是我想从精确的行开始读取的使用方法,但是我无法找到StreamReader的任何内容。有没有这样的事情?

回答

1

在后台加载数据并实时显示它们。我不知道该怎么做,我不知道该如何解决这个问题。

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

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

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

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

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

SkipTake扩展方法可帮助在这里。

+0

我该如何处理过滤?正如我所提到的,我应该再次加载比较字符串的文件吧?当用户更改(添加,删除)字母时,我应该再次加载文件并控制显示哪一行以及哪些不显示。 – 2010-10-20 08:39:17

+0

你可以有一个额外的参数给ReadFile函数,这将允许你过滤行。 – 2010-10-20 08:43:27

+0

好的,谢谢,我会尝试。 – 2010-10-20 08:44:35