当前位置: 首页 > 知识库问答 >
问题:

java-搜索长度为1亿个字符的文本+?

年高洁
2023-03-14

我想搜索一个文本文档(或多个文本文档),其中的字符总数可能高达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的情况下搜索文本文件呢?

共有1个答案

章锦
2023-03-14

这是一个非常简单的算法,有点类似于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个字符。 基本上我想测量长度并打印每个字符。像 "கு", "மா", "ர்" . 附言:这是泰米尔语。