我想搜索一个文本文档(或多个文本文档),其中的字符总数可能高达1亿个字符+。
"FADE OUT."
312,719 - source length.
62,543,800 - source length multiplied by 200.
1) Phrase found in 6 ms - searched 312,719 characters. Used 261 mb.
2) Phrase found in 1 ms - searched 625,447 characters. Used 269 mb.
3) Phrase found in 0 ms - searched 1,250,903 characters. Used 284 mb.
4) Phrase found in 0 ms - searched 2,501,815 characters. Used 315 mb.
5) Phrase found in 0 ms - searched 5,003,639 characters. Used 33 mb.
6) Phrase found in 0 ms - searched 1,0007,287 characters. Used 159 mb.
7) Phrase found in 0 ms - searched 20,014,583 characters. Used 114 mb.
8) Phrase found in 0 ms - searched 40,029,175 characters. Used 229 mb.
9) Phrase found in 0 ms - searched 80,058,359 characters. Used 763 mb.
10) Phrase found in 0 ms - searched 160,116,727 characters. Used 916 mb.
源长度是我正在搜索的文本文件的平均大小。我把它乘以200,得到200个文本文件的平均大小。
那么,如何在不使用这么多RAM的情况下搜索文本文件呢?
这是一个非常简单的算法,有点类似于RabinKarp(RabinKarp更有效,但当然更复杂)方法find
返回所提供短语的第一次出现的索引。(code)
public class SearchForPhrase {
static int hash(String phrase) {
int hash = 0;
for (int i = 0; i < phrase.length(); i++) {
hash += phrase.codePointAt(i);
}
return hash;
}
static boolean equals(Deque<Character> txt, String phrase) {
int i = 0;
for (Character c : txt) {
if (!c.equals(phrase.charAt(i++))) {
return false;
}
}
return true;
}
static int find(String phrase, Reader in) throws Exception {
int phash = hash(phrase);
int hash;
BufferedReader bin = new BufferedReader(in);
char[] buffer = new char[phrase.length()];
int readed = bin.read(buffer);
if (readed < phrase.length()) {
return -1;
}
String tmp = new String(buffer);
hash = hash(tmp);
if (hash == phash && tmp.equals(phrase)) {
return 0;
}
Deque<Character> queue = new LinkedList<>();
for (char c : buffer) {
queue.add(c);
}
int curr;
int index = 1;
while ((curr = bin.read()) != -1) {
hash = hash - queue.removeFirst() + curr;
queue.add((char) curr);
if (hash == phash && equals(queue, phrase)) {
return index;
}
index++;
}
return -1;
}
public static void main(String[] args) throws Exception {
StringWriter writer = new StringWriter();
PrintWriter out = new PrintWriter(writer);
out.println("Discuss the person's qualifications for the graduate study in the chosen field. Statements of past");
out.println("performance, accomplishments, and contributions are helpful. The more relevant the items mentioned, andd");
out.flush();
System.out
.println(find("Discuss", new StringReader(writer.toString())));
System.out.println(find("the", new StringReader(writer.toString())));
System.out.println(find("qualifications",
new StringReader(writer.toString())));
System.out.println(find("andd", new StringReader(writer.toString())));
}
}
出:
0
8
21
199
本文向大家介绍java中判断字段真实长度的实例(中文2个字符,英文1个字符),包括了java中判断字段真实长度的实例(中文2个字符,英文1个字符)的使用技巧和注意事项,需要的朋友参考一下 实例如下: 1、判断字符串是否为连续的中文字符(不包含英文及其他任何符号和数字): Regex.IsMatch("中文","^[/u4e00-/u9fa5]"); 2、判断字符串是否为中文字符串(仅不包含英文
问题内容: 我正在从另一台服务器下载CSV文件,作为供应商的数据提要。 我正在使用curl获取文件的内容,并将其保存到名为的变量中。 我可以很好地达到那部分,但是我尝试通过爆炸并获得行数组,但是失败并出现“内存不足”错误。 我,大约是3050万个字符。 我需要处理这些值并将它们插入数据库。为了避免内存分配错误,我该怎么办? 问题答案: PHP令人窒息,因为它耗尽了内存。不要使用curl来用文件的内
根据DEFLATE规范(RFC 1951),文字和长度字母组合在一起,以便使用一个哈夫曼树进行解码。文字和长度字母表都是256个大符号,但组合文字/长度字母表是286个长符号,其中一个符号是块结束字符。 在组合字母表中表示的可能的256个长度符号中,只有29个,在长度符号之后的压缩数据中包含额外的位,以便在解码时读取长度的全部值。这些额外的位不被压缩,被读取为文字机器整数。 为什么不在组合字母表中
问题内容: 我正在努力获取unicode字符串的计数,并尝试了各种选择。看起来像是一个小问题,但却大有作为。 在这里,我试图获取字符串str1的长度。我得到的是6。但实际上是3。将光标移到字符串“குமார்”上还会显示为3个字符。 基本上我想测量长度并打印每个字符。如“கு”,“மா”,“ர்”。 PS:这是泰米尔语。 问题答案: 找到了解决您问题的方法。 基于这个SO答案,我制作了一个使用正则
我正在努力获取unicode字符串的计数,并尝试了各种选项。看起来是个小问题,但影响很大。 这里我试图得到字符串str1的长度。我得到的是6分。但实际上是3。将光标移到字符串上“குமார்“也显示为3个字符。 基本上我想测量长度并打印每个字符。像 "கு", "மா", "ர்" . 附言:这是泰米尔语。