我不玩IT 2020-04-24 18:37 采纳率: 0%
浏览 180

数据库数据太多与JAVA集合对象存储问题

遇到一Android点歌项目,歌单信息是txt文件。原本的项目第一次打开时將TXT文件解析存储到数据库db文件中,然后通过sql查询,后来发现了问题,让我修改。(说明:数据有37万条,而且数据在不断增加。)

已做的优化:
1.已经加了索引和分页的查询优化。
2.纯sql查询,不存在数据库框架做的额外开销。
3.只查询需要的字段。
4.使用异步查询。

需求:
1.文字查询还是有点延迟,大概1秒左右,需要优化。
2.最重要的问题来了,拼音查询,自定义键盘,随着拼音键盘的点击,不能点的拼音按键变灰。(拼音键盘变灰处)

第一个问题解决不了老板勉强可以接受,但是第二个问题有点严重。因为要想知道哪些拼音按键变灰,要查询全部的数据啊!那么分页就不能用了,这使得查询时间大大增加。输入第一个拼音,要3秒左右,键盘才能作出反应,第二个拼音之后会好一点,但是但是也不理想。

针对问题2,最终想到了两个办法:
1.將歌单表按歌名首字母a-z分表存储,如果还是慢,还可以再分aa-az...za-zz。但是后来发现即使速度快了26倍,还是有点慢,就算是再分aa-az...za-zz,也频繁切换查询表,或表链接太多也容易出问题,而且也不能解决问题1,所以放弃了。

2.因为内存IO比外存IO要快很多,所以起动APP时可以將歌单信息全部查询存储在list集合里面,每次查询直接遍历集合即可。
这样果然快很多,即使查询全部数据最高也只用300ms左右,同时解决了两个需求。但新问题又来了,list存储数据过大,导致内存使用过多,这样不仅仅让APP容易被杀,而且出现卡顿问题。于是我將开启另外一个进程存储和查询list,虽然问题看似解决了,但是感觉心里不踏实。

问题:针对点歌拼音键盘变灰处理还有什么解决方案吗?或者list存储数据过多导致内存占用过大,有什么解决办法吗?

  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-03-15 01:02
    关注

    针对点歌拼音键盘变灰处理的问题,你可以考虑使用缓存机制,将查询过的数据缓存起来,下一次查询时直接从缓存中获取数据,这样可以避免大量重复查询数据库或遍历集合。可以使用LRU Cache或者自定义缓存机制实现。同时,对于拼音键盘变灰的问题,你可以根据用户输入的拼音查询出相应的结果并缓存起来,当用户再次输入同样的拼音时直接从缓存中获取结果即可。

    针对list存储数据过多导致内存占用过大的问题,你可以考虑使用分页加载或者延迟加载的方式,将数据分批加载到内存中,当用户需要查看更多数据时再加载下一页的数据。同时,在内存中缓存数据时,采用软引用或者弱引用的方式可以有效地避免内存溢出的问题。另外,你也可以控制list的最大容量,当达到一定容量时,将不必要的数据从list中移除,以释放内存。

    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置