2011-02-27 81 views
0

可能重複:
do searching in a very big ARPA file in a very short time in java如何在java中使用特定格式在非常大的文件中搜索字符串?

我的文件的格式:

\ DATA \

的ngram 1 = 19

的ngram 2 = 234

的ngram 3 = 1013

\ 1-克:

-1.7132 puluh -3.8008

-1.9782 -3.8368薩圖馬雷

\ 2-克:

-1.5403尋找及體驗dua -1.0560

-3.1626 dalam ini 0.0000

\ 3-克:

-1.8726 ITU擔迪迦

-1.9654 ITU擔untuk

\端\

正如你可以看到我在1的ngram行數, 2和3.不需要讀取整個文件。如果一個輸入字符串是一個單詞的字符串,程序可以在\ 1-grams:part中搜索。如果輸入字符串是雙字串,則程序可以在\ 2-grams中搜索:部分等等。最後,如果程序在文件中找到輸入字符串,它必須返回位於字符串左側和右側的兩個數字。此外,我不得不說,文件的每個部分已經排序。我相信我不必完全讀取文件,並使用索引文件不能解決我的問題。這些方法需要很長時間,我的講師說,搜索必須在不到1分鐘的時間內完成,以處理如此龐大的文件。我認爲最好的辦法是找到一種跳轉到特定行而不是文件字節的方式,但我不知道如何才能做到。如果有人能幫助我解決我的問題,那將會很棒。

我的文件差不多是800MB。我發現使用BufferedReader是一種非常快速讀取文件的好方法,但是當我讀取這樣一個大文件並逐行放入數組時,需要超過30分鐘的時間。

+0

這功課嗎? (你提到一個演講)。你試過什麼了?你可以編輯你的問題,並顯示你到目前爲止嘗試過的一些代碼。 – jmq 2011-02-27 05:28:03

+0

這是一樣的問題http://stackoverflow.com/questions/5127640/do-searching-in-a-very-big-arpa-file-in-a-very-short-time-in-java – andersoj 2011-02-27 05:31:11

+0

那麼除非你有一個明確定義的結構和數據字節,否則你需要掃描整個文件..如果以任何方式記錄文件中的字節位置並將其索引到文件頂部,則無法AFAIK .. – 2011-02-27 05:33:57

回答

1

你的文件有多大?一分鐘是很長的時間。我會建議使用BufferedReader來提高效率(也適用於它的readLine方法)。

如果真的時間過長,有兩種方法來記住,不使用索引:

  1. 部隊在該文件中的每一行是相同的長度。然後,您可以通過計算其開始跳轉到特定行。如果你不知道你需要的行號,那麼至少你可以用它來有效地對整個文件進行二進制搜索。

  2. 跳轉到任意位置並向前閱讀,直到找到以\開頭的行。這會告訴你,你是否找到了正確的部分,或者你是否需要從那裏跳到前面,或者從跳到的任意位置向後跳。這也可以用來爲您需要的數據創建二進制搜索策略。它依賴於\是部件開始的可靠指標。

+0

跳到一行仍然涉及從開始讀取文件來查找'\ n',然後計算行號,所以這不是有效的方法 – 2011-02-27 05:38:26

+0

@Shekhar_Pro我想你錯過了他的整體二進制搜索解決方案。是的,他所讀的所有文本都必須閱讀整行。但是,如果他找到文件的中間部分(一次搜索操作;不需要讀取每個字節到達那裏),並找到下一部分的標題以確定所需部分是在前半部分還是後半部分,則已經消除幾乎讀了一半的文件。在您確定的大塊中再次執行此操作可以消除文件的另一個四分之一等等。 – 2011-02-27 06:39:36

+0

@Shekhar_Pro - 如果每行的長度相同(我的建議#1),則不必計數'\ n';只是'seek()'到開始你想要的行的位置,你知道,因爲所有的行都是相同的長度。 – 2011-02-27 06:49:47

相關問題