Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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,我有一个需要读取的文件,它的大小超过50gb,所有字符都在一行中 现在是棘手的部分: 我必须在所有双引号字符上拆分它,找到一个子字符串(srsName)并获取它后面的元素,该元素在拆分子字符串上的for循环中具有I+1索引(“值”) 问题: 是否有一些渐进式搜索实现或其他方法,我可以使用,而不是填满我的内存 要简化: 文件中有相当多的srsName子字符串,但我只需要读取其中一个,因为它们后面都有相同的值 关于该文件的一些信息: 它是为xsl转换准备的xml。我不能使用创建缩进的xslt,因为我

我有一个需要读取的文件,它的大小超过50gb,所有字符都在一行中

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

问题: 是否有一些渐进式搜索实现或其他方法,我可以使用,而不是填满我的内存

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

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

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

<sometag:sometext srsName="value">

您可以尝试使用BufferedReader-


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

您可以尝试使用BufferedReader-


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

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


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

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

<sometag:sometext srsName="value">

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

我是这样做的:

<sometag:sometext srsName="value">
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];
字符串myBuff=”“;
焦焦棕;

而(myBuff.length()我是这样做的:

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];
字符串myBuff=”“;
焦焦棕;

while(myBuff.length()为什么不使用真正的XML解析器,如SAX/StAX?尝试手动解析XML只会带来痛苦(以及误报、误报、错误编码和缺少字符引用。但主要是痛苦)。预期的“值”长度是多少在你的文件中?天哪…一个50gb的单行文件?介意我问一下它是什么吗?我猜也是正则表达式,但这需要你将字符串加载到内存中。“value”的长度可以从1到16个字符不等。正如@Joachim Sauer所建议的,使用基于SAX的xml解析器(而不是基于DOM的,因为基于DOM的xml解析器会覆盖在50gb的文件上)。为什么不使用真正的XML解析器,如SAX/StAX?尝试手动解析XML只会带来痛苦(以及误报、误报、错误编码和缺少字符引用。但主要是痛苦)。预期的“值”长度是多少在你的文件中?天哪…一个50gb的单行文件?介意我问一下它是什么吗?我猜也是正则表达式,但这需要你将字符串加载到内存中。“value”的长度可以从1到16个字符不等。正如@Joachim Sauer所建议的,使用基于SAX的xml解析器(而不是基于DOM的,因为基于DOM的xml解析器会覆盖在50gb的文件上)我只使用缓冲读写器,但是你的答案给了我一个关于如何完成我需要做的事情的想法。我只使用缓冲读写器,但是你的答案给了我一个关于如何完成我需要做的事情的想法。在OP的情况下,第一个字符和最后一个字符是唯一的,并且不在字符串中间重复。这使得只查看每个字符。CE(在OP的情况下,只在<代码>开始查找匹配),第一个字符和最后一个字符是唯一的,并且在字符串的中间不重复。这使得只查看一个字符(开始只查找<代码>的匹配)。