Android将数据读入内存

时间:2018-07-26 22:48:49

标签: android performance csv garbage-collection instantiation

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

数据看起来像这样,有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的{​​{1}}变成String[],但这花了更长的时间。使用Android Studio内存事件探查器,我可以看到拆分导致大量Float[]的实例化,而这正是导致GC事件的原因。

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

尽管将一些数据存入内存似乎是一项很常见的任务,但我很难找到其他许多人遇到同样的问题。我是否完全不了解我的打算?还有其他方法可以将这些数据拖到我刚刚找不到的内存中吗?

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

1 个答案:

答案 0 :(得分:0)

12.500行x 101列= 1.262.500字符串。那应该解释一切。您正在创建超过一百万个对象字符串。在除了字符串值之外的内存方面,您必须考虑到每个值都将作为String对象保存,并且将超过100万个对象推入内存当然会产生很大的影响。 对于您的方案,方法是使用SQLite数据库。与您认为不是太多的相反。对于如此大量的数据,建立SQLite数据库非常简单且非常有效。