2011-10-10 49 views
1

在文本文件中,行在每行的結尾處由\ n檢測。爲此,有必要讀取整個文件,這對大文件(比如說2GB)來說是個大問題。我正在尋找一種方法來閱讀一行,而無需遍歷整個文件(儘管我知道它應該是一個複雜的過程)。映射平面文本文件

  1. 我知道的第一種方法是使用fseek()和offset;但這是不實際的。
  2. 創建鍵/值的平面文件;但我不確定是否有辦法避免將整個內容加載到RAM中(它應該像在php中讀取數組一樣)。
  3. 或者,我們可以在每行的開始處做一些數字來讀取。我的意思是,是否可以通過跳過行內容(轉到下一行)來讀取行首的第一個數字。

    768| line content is here 
    769| another line 
    770| something 
    

如果只讀取第一個數字,應讀的總數據並不多,甚至對大文件。

+0

你可以始終在循環中逐行讀取整個文件,提取起始數字並丟棄剩餘的行。但是,您需要注意性能。對於2 GB文件,這可能需要一段時間。 –

+0

我正在尋找的所有內容都是爲了避免逐行閱讀整個文件。 – Googlebot

+0

您是否需要閱讀可以在行號上編制索引的特定行?如果是這樣,只需要進行二分查找。在文件中間讀取(說出)200個字符來查找行號。然後重複上述任一部分,直到您到達正確的位置。 –

回答

1

您是否需要閱讀可以在行號上編制索引的特定行?如果是這樣,只需要進行二分查找。在文件中間讀取(說出)200個字符來查找行號。然後重複上述任一部分,直到您到達正確的位置。

+0

這些行是可變長度。如何通過讀取文件中間的200個字符來找出行號? –

+0

如果您在200個字符中找不到行號,請繼續向前閱讀(或向後閱讀),直到您完成。然後,當你有一個行號,繼續使用二分搜索算法:) – Svish

0

我認爲沒有簡單的方法來做你想做的事情。記錄長度不定,長度不能預先確定,對嗎?

如果文件始終是相同的(或至少不經常修改的),我把它的數據庫,或者至少創建索引文件(備案號:偏移量)和使用FSEEK()

+0

你會建議什麼來快速創建和更新索引文件? – Googlebot

+0

如果您逐行寫入文件,如您在下面的註釋中所述,則可以並行創建索引。只需累積偏移量(以前的數據長度)並將每行存儲在文件固定長度記錄(例如使用數據包)中的索引文件中。你可以將它們全部包裝在單個類中並在任何地方使用。要讀取字符串,您只需計算索引中的偏移量:linenum * recordlenght,fseek那裏並讀取記錄長度字節,解壓縮文本文件中的fseek並讀取該行。它看起來很複雜,但是是一種常用的索引方法。 – dmitry