2011-02-27 77 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

相关问题