2011-05-05 52 views
1

我有一個文本文件,用於保存文件和單詞(及其頻率)出現在其中的索引。我需要將文件讀入內存並存儲單詞,以便可以搜索它們。文件內的高效隨機訪問? [C]

<files> 169 
    0:file0.txt 
    1:file1.txt 
    2:file2.txt 
    3:file3.txt 
    ... etc ... 
</files> 
<list> word 2 
    9: 10 
    1: 2 
</list> 
<list> word2 4 
    3: 19 
    5: 12 
    0: 2 
    8: 2 
</list> 
... etc ... 

的問題是,這個索引文件會變得非常大,並不會全部裝入內存在一次:文件格式如下。我的解決方案是隻將其中一小部分存儲在HashTable中,然後當我需要爲另一個單詞獲取數據時,我會踢出一箇舊單詞,然後解析文件中新單詞的數據。

如何在C中有效地完成此操作?我一直在想,一旦我達到某些要點,我將不得不和fseek做一些事情並重新開始。

謝謝,
邁克

+1

因爲這個文本文件看起來不夠結構化,所以我無法想象這會是_fun_。你可以做一些類似於切換到[SQLite3](http://en.wikipedia.org/wiki/SQLite)的所有數據存儲?您可以將輸入文件讀入SQLite數據庫,完成您的工作,然後再以自己的格式編寫輸出文件。 (如果它必須交互)。讓其他人處理高速訪問。 :)(或者:寫下你自己的_binary_格式,其中包含固定長度的記錄,參見'fread(3)'。糟糕的腐敗處理,但是優秀的隨機訪問) – sarnold 2011-05-05 02:53:20

+0

不幸的是,這是上課。誰在C程序中獲得樂趣了? – Swift 2011-05-05 03:15:12

+3

我這樣做。你有沒有嘗試過看'mmap'(或Windows的等價物)呢? – 2011-05-05 03:19:26

回答

0

這樣做的最好方法就是保留一個指向文件當前位置的指針,並在達到最後時使用rewind(FILE *f);

1

雖然C有繩支架差 - 從我可以告訴看樣品,它有不同的模式,從磁盤重新解析,這將是實用的。

但是,我會考慮將文件轉換成數據庫,並從那裏工作。除非有理由不採用第三方數據庫引擎。

如果您決定重新解析文本文件,它看起來並不難。第一遍存儲每個列表的起始位置,作爲一對。然後,你所要做的就是尋找索引來讀取特定單詞的數據。

如果您的效率問題需要計算機執行解析需要多長時間,請將其忘記,找出對您來說最簡單的方法。不要優化,直到你知道你需要。電腦速度快,價格便宜,程序員不是。

1

像mattnz指出的,這是使用單獨的數據庫層最好實現的。你可以試試SQlite。幾乎爲零設置,非常穩定。否則,如果您想在C中執行此操作,則可以在文件的開始處使用鏈接/索引指向文件的每個部分。部分是<文件> .. < /文件>,<列表> .. < /列表>。這只是我的頭頂。如果您閱讀任何有關實施數據庫的書籍,可以找到更多技巧。