在一个非常大的单行文件中找到字符串

时间:2013-09-11 14:19:44

标签: java

我有一个我需要阅读的文件超过50gb,所有字符都在一行中。

现在是棘手的部分: 我必须在所有双引号字符上拆分它,找到一个子字符串(srsName)并获取它后面的元素,它在for循环中通过split子串具有i + 1索引(“value”)。

问题: 是否有一些渐进的搜索实现或其他方法,我可以使用而不是填补我的记忆?

简化: 文件中有很多srsName子串,但我需要只阅读其中一个,因为它们之后都有相同的值。

关于文件的一些事情: 它是为xsl转换准备的xml。我不能使用创建缩进的xslt,因为我需要尽可能少地使用磁盘/内存。

这是值在文件中显示的方式。

<sometag:sometext srsName="value">

3 个答案:

答案 0 :(得分:2)

在大型文件中加速搜索的一种方法是使用快速的内存中搜索算法来搜索文件。

一个特别快的算法是Knuth–Morris–Pratt:它最多查看每个字符两次,并且需要一个小的预处理步骤来构建“跳转表”,告诉您应该移动哪个位置以继续搜索。该表的构造方式是不会让你跳得太远,所以你可以通过在文件中保留一个文件的小“搜索窗口”来进行搜索:因为你正在寻找只有七个字符的单词,当搜索在文件中进行时,只保留内存中的最后六个字符就足够了。

答案 1 :(得分:1)

您可以尝试使用BufferedReader - http://download.oracle.com/javase/6/docs/api/java/io/BufferedReader.html

这将允许您使用read方法一次指定要读入内存的字符数。

答案 2 :(得分:1)

我这样做了:

String myBuff = "";
char charBuff;
while(myBuff.length()<30)myBuff+=(char)br.read();

charBuff=(char)br.read();
try{
  while(true){
    myBuff=myBuff.substring(1)+charBuff;
    if(myBuff.startsWith("srsName"))break;
    charBuff=(char)br.read();
  }
}
catch(Exception e){}
value = myBuff.split("\"")[1];

其中br是我的BufferedReader