【问题标题】:Android Read Data Into MemoryAndroid 将数据读入内存
【发布时间】:2018-07-26 22:48:48
【问题描述】:

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

数据如下所示,有 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[] 存储在一个对象中。

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

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

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

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

【问题讨论】:

    标签: android performance csv garbage-collection instantiation


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的快速回复!我会将其存储在 SQLite 中。
    • 特别是当你使用像 ROOM 这样的东西时,它变得非常容易
    猜你喜欢
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多