1

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

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

问题:是否有一些渐进式搜索实现或其他方法可以用来代替填满我的记忆?

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

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

这就是值在文件中呈现的方式。

<sometag:sometext srsName="value">
4

3 回答 3

2

加快在海量文件中搜索的一种方法是采用快速内存​​搜索算法来搜索文件。

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

于 2013-09-11T14:39:19.270 回答
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

于 2013-09-11T15:45:44.543 回答
1

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

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

于 2013-09-11T14:30:18.150 回答