Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中以特定格式搜索非常大的文件中的字符串?_Java - Fatal编程技术网

如何在java中以特定格式搜索非常大的文件中的字符串?

如何在java中以特定格式搜索非常大的文件中的字符串?,java,Java,可能重复: 我的文件格式: \资料\ ngram 1=19 ngram 2=234 ngram 3=1013 \1克: -1.7132 puluh-3.8008 -1.9782 satu-3.8368 \2克: -1.5403达拉姆杜瓦-1.0560 -3.1626 dalam ini 0.0000 \3克: -1.8726 itu dan tiga -1.9654国际电联和联合国 \结束\ 正如你所看到的,我在ngram 1,2和3中有很多行。不需要读取整个文件。如果输入字符串是一个单词字符

可能重复:

我的文件格式:

\资料\

ngram 1=19

ngram 2=234

ngram 3=1013

\1克:

-1.7132 puluh-3.8008

-1.9782 satu-3.8368

\2克:

-1.5403达拉姆杜瓦-1.0560

-3.1626 dalam ini 0.0000

\3克:

-1.8726 itu dan tiga

-1.9654国际电联和联合国

\结束\

正如你所看到的,我在ngram 1,2和3中有很多行。不需要读取整个文件。如果输入字符串是一个单词字符串,则程序只能在\1-grams:part中搜索。如果输入字符串是两个单词的字符串,则程序只需搜索\2-grams:part等。最后,如果程序在文件中找到输入字符串,它必须返回位于字符串左右两侧的两个数字。此外,我必须说,文件的每个部分都已排序。我确信我不必完全读取文件,使用索引文件也不能解决我的问题。这些方法需要很多时间,我的讲师说,对于如此大的文件,搜索必须在不到1分钟的时间内完成。我认为最好的办法是找到一种跳转到特定行而不是文件字节的方法,但我不知道如何才能做到这一点。如果有人能帮我解决问题,那就太好了


我的文件几乎是800MB。我发现使用BufferedReader是一种快速读取文件的好方法,但当我读取如此大的文件并将其逐行放入数组时,需要30分钟以上。

您的文件有多大?一分钟是很长的时间。为了提高效率,我建议使用BufferedReader(以及它的
readLine
方法)

如果这真的需要很长时间,那么会想到两种不使用索引的方法:

  • 强制文件中的每一行长度相同。然后,您可以通过计算某一行的起点跳到该行。如果您不知道需要的行号,那么至少可以使用它对整个文件进行有效的二进制搜索

  • 跳转到任意位置并向前阅读,直到到达以
    \
    开头的行。这将告诉你是否找到了正确的部分,或者你是否需要从那里向前跳,或者从你跳到的任意位置向后跳。这也可用于为所需数据创建二进制搜索策略。它依赖于
    \
    作为零件开始的可靠指示器


  • 这是家庭作业吗?(你提到一次讲座)。到目前为止你试过什么?您是否可以编辑您的问题并显示一些您迄今为止尝试过的代码。这也是相同的问题,除非您有一个定义良好的结构和已知的数据字节,否则您需要扫描整个文件。。如果您可以以任何方式记录文件中的字节位置并将其索引到文件顶部,那么就没有办法了……跳转到一行仍然需要从头开始读取文件,找到
    \n
    ,然后计算行号,因此这是不有效的way@Shekhar_Pro我想你错过了他修改二进制搜索的总体解决方案。是的,他读的每一行他都要读整行。但是如果他找到了文件的中间部分(一个seek操作;不需要读取每个字节就可以到达那里),然后找到下一个节的标题以确定所需的节是在前半部分还是后半部分,那么您就消除了读取几乎一半的文件。在您确定的块中再次执行此操作会消除文件的另一个四分之一,依此类推。@Shekhar#u Pro-如果每一行的长度相同(我的建议是1),则不必计算
    \n
    ;只要
    seek()
    到你想要的行的起始位置,你知道,因为所有行的长度都相同。正是..这就是我在对这个问题的评论中所说的。。。