Java 在不落后的情况下进行更好的搜索

Java 在不落后的情况下进行更好的搜索,java,android,search,Java,Android,Search,因此,我有一个edditbox,它在data.txt中搜索stopname,并使用我的自定义适配器将其显示到listview,因此每次我输入一个单词时,它都会过滤结果 我的问题是,当我再次输入一个单词时,它会有一点滞后,因为我认为它会过滤所有结果。 我的问题是,我如何才能使它不滞后我知道我有没有办法在后台过滤数据 PS.my data.txt是一个非常大的数据集合,比如说100mb的停止名称数据 searchEditText2.addTextChangedListener(new TextWat

因此,我有一个edditbox,它在data.txt中搜索stopname,并使用我的自定义适配器将其显示到listview,因此每次我输入一个单词时,它都会过滤结果

我的问题是,当我再次输入一个单词时,它会有一点滞后,因为我认为它会过滤所有结果。

我的问题是,我如何才能使它不滞后我知道我有没有办法在后台过滤数据

PS.my data.txt是一个非常大的数据集合,比如说100mb的停止名称数据

searchEditText2.addTextChangedListener(new TextWatcher(){

            @Override
            public void afterTextChanged(Editable arg0) {
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                    int arg2, int arg3) {
            }

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2,
                    int arg3) {

                customAdapter.getFilter().filter(cs);

            }

        });

我建议您先显示一些特定的单词,然后可能会在滚动显示下一个搜索结果,甚至在加载更多按钮上单击显示更多记录。一次显示如此庞大的数据可能是不正确的。考虑到不同的android设备和处理器速度,一些设备可能根本没有响应。

我建议您先显示一些特定的单词,然后滚动显示下一个搜索结果,甚至在加载更多按钮上单击显示更多记录。一次显示如此庞大的数据可能是不正确的。考虑到不同的android设备以及处理器的速度,一些设备可能根本没有响应。

由于您需要搜索一个巨大的文件,并且将其全部放入堆内存太危险(可能会导致OOM),因此您可以采取下一步措施使事情变得更好:

  • 将文件加载到JNI代码中并在那里进行搜索。当然,这将需要一些加载时间和内存,并会使操作系统更愿意在进程进入后台时终止进程,但速度会快得多

  • 缓存以前的结果

  • 压缩文件,使更多的工作在CPU而不是存储单元上

  • 根据数据和查询,想出更好的方法来帮助搜索。因为我对数据和查询都没有任何概念,所以我不能说得更具体。例如,如果所有文本都是英文的,您可以使用ascii而不是unicode,因此每个字符将使用一个字节而不是两个字节

  • 如果速度太慢,你甚至可以把它放在远程服务器上,从设备上查询。在那里,您可以将其全部加载到内存中,并随时准备好进行查询

  • 您可以使用某种方式对数据进行处理,以加快搜索速度。我认为KMP算法似乎还可以。我认为它有一个很好的实现(没有测试)。有一段视频描述了它是如何工作的。也许您不必这样做,因为如何搜索字符串的内置实现已经相当有效,所以只有在您尝试过其他解决方案的情况下才能这样做

    另外,我认为正则表达式也可以实现同样的效果


  • 无论您选择哪一种,请记住,与成熟的PC相比,它仍然是一个低规格的设备,因此请小心RAM的使用,否则您将在某些设备上获得OOM。

    因为您需要搜索一个巨大的文件,并且将其全部放入堆内存太危险(可能会获得OOM),你可以做下一件事来让事情变得更好:

  • 将文件加载到JNI代码中并在那里进行搜索。当然,这将需要一些加载时间和内存,并会使操作系统更愿意在进程进入后台时终止进程,但速度会快得多

  • 缓存以前的结果

  • 压缩文件,使更多的工作在CPU而不是存储单元上

  • 根据数据和查询,想出更好的方法来帮助搜索。因为我对数据和查询都没有任何概念,所以我不能说得更具体。例如,如果所有文本都是英文的,您可以使用ascii而不是unicode,因此每个字符将使用一个字节而不是两个字节

  • 如果速度太慢,你甚至可以把它放在远程服务器上,从设备上查询。在那里,您可以将其全部加载到内存中,并随时准备好进行查询

  • 您可以使用某种方式对数据进行处理,以加快搜索速度。我认为KMP算法似乎还可以。我认为它有一个很好的实现(没有测试)。有一段视频描述了它是如何工作的。也许您不必这样做,因为如何搜索字符串的内置实现已经相当有效,所以只有在您尝试过其他解决方案的情况下才能这样做

    另外,我认为正则表达式也可以实现同样的效果

  • 无论您选择哪一种,请记住,与成熟的PC相比,它仍然是一个低规格的设备,因此请小心RAM的使用,否则您将在某些设备上获得OOM