【问题标题】:Reading a large dataset efficiently - Android高效读取大型数据集 - Android
【发布时间】:2013-06-02 15:57:06
【问题描述】:

我正在开发一款具有离线搜索功能的 Android 应用。这需要我阅读一个包含大约 170,000 个条目的字典文件。

我面临严重的性能问题,最初认为这是由于我的代码有 String.match(regex) 循环通过我已将数据读入的 ArrayList

但是,深入挖掘后,我发现主要问题实际上是数据 I/O。仅通过BufferedReader + InputStream 读取字典文件就需要大约 10,000 毫秒,而无需执行任何搜索。我尝试过其他读取数据的方法,例如使用StringBuilder,但它们似乎没有多大帮助。

这个问题有哪些可能的解决方案?

需要考虑的几点:

  • 搜索是递归的
  • 应用必须保持离线状态
  • 条目基本上是文本行,虽然是东亚语言(增加了搜索的难度,因为整个句子可以是单个字符串。)

我用于读取数据的标准代码是:

InputStream is = getResources().openRawResource(R.raw.data);     
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
     while(br.readLine() != null){
         blahblah....
        }

【问题讨论】:

  • 你为什么不使用数据库?
  • 说实话,我还没有真正尝试过从现有数据库中读取数据,通常是在运行时创建数据库。也许我应该这样做。
  • 您每次在运行时创建 170.000 条记录?它们是相同的还是随机的?
  • 我的意思是我以前制作的应用程序通常只创建数据库,而不是从现有数据库中检索数据。在这种特殊情况下,不需要写入数据库,只需检索。
  • stackoverflow.com/questions/513084/… 似乎有可能,但并不简单

标签: java android io inputstream


【解决方案1】:

我同意 Reuben L 的观点。我会使用 sqlite 数据库而不是解析文本文件。

在我的一个应用程序中,我将捷克共和国的所有村庄和城市(超过 200000 条记录)放入数据库中,以便快速离线搜索。它可以在 1 秒内根据名称前缀找到城市列表。

为了让它更快,我引入了数据库索引。我添加了一列并在那里填写城市名称的第一个字母。然后我可以像这样按前缀搜索城市:

select * from cities where firstLetter = ? and cityName like ?;

它提高了两倍以上的性能。

【讨论】:

  • 请注意,我在 sqlite 之上使用了 FTS(即 MATCH)以获得更快的性能。
猜你喜欢
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多