2010-10-20 75 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