首页 > 解决方案 > Android 将数据读入内存

问题描述

我正在尝试将一些表格数据读入内存以在我的应用程序运行期间使用,但反复实例化这些值会触发垃圾收集并导致数据需要很长时间才能加载。我已经读到实例化大量对象时会发生这种情况,但是我无法想出一种存储数据的方法。

数据如下所示,有 12,500 行和 101 列:

+-------+-------------+-------------+-----+---------------+
| id    | parameter 1 | parameter 2 | ... | parameter 100 |
+-------+-------------+-------------+-----+---------------+
| 1     | 237.1238220 | 483.2398201 | ... | 403.302910100 |
| 2     | (Float Val) | (Float Val) | ... |  (Float Val)  |
.
.
.
| 12500 | (Float Val) | (Float Val) | ... |  (Float Val)  |
+-------+-------------+-------------+-----+---------------+

目前,我正在使用 BufferedReader 逐行读取数据。这不需要太多时间。然后,我使用单个字符分隔符 ( ",") 以逗号分隔每一行并将其存储String[]在一个对象中。

以前,我试图map进入String[]a Float[],但这需要更长的时间。使用 Android Studio 内存分析器,我可以看到拆分导致大量Strings 的实例化,这就是导致 GC 事件的原因。

我曾考虑过将数据存储在 SQLite 或 Firebase 中,或者设置一个快速服务器来处理大数据,但所有这些对于将 8 MB 数据拉入内存来说似乎都是多余的。

尽管将一些数据拉入内存似乎是一项非常常见的任务,但我很难找到许多其他有同样问题的人。我完全不知道我将如何处理这件事吗?有没有其他方法可以将这些数据拉入我还没有找到的内存中?

任何帮助,将不胜感激。谢谢!

标签: androidperformancecsvgarbage-collectioninstantiation

解决方案


12.500 行 x 101 列 = 1.262.500 个字符串。这应该可以解释一切。您正在创建超过 100 万个对象字符串。除了字符串值之外的内存,你必须考虑每个值都会被保存为一个String对象,超过100万个对象推送到内存当然会有很大的影响。对于您的方案,要走的路是 SQLite 数据库。与你认为的相反,它并不过分。对于如此大量的数据,设置 SQLite 数据库非常简单且非常有效。


推荐阅读