Android 将数据读入内存
Android Read Data Into Memory
我试图将一些表格数据读入内存以供在我的应用程序的整个 运行 中使用,但是重复实例化这些值会触发垃圾回收并导致数据加载时间很长。我读到在实例化大量对象时会发生这种情况,但我无法想出一种存储数据的方法。
数据如下所示,有 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[]
转换为 Float[]
,但这需要更长的时间。使用 Android Studio 内存分析器,我能够看到拆分导致大量 String
的实例化,这就是导致 GC 事件的原因。
我考虑过将数据存储在 SQLite 或 Firebase 中,或者设置一个快速服务器来处理大数据,但是所有这些对于将 8 MB 的数据拉入内存来说似乎太过分了。
虽然将一些数据拉入内存似乎是一项很常见的任务,但我很难找到许多其他有同样问题的人。我完全不了解我的处理方式吗?有没有其他方法可以将这些数据拉入内存,但我还没有找到?
如有任何帮助,我们将不胜感激。谢谢!
12500 行 x 101 列 = 1262500 个字符串。这应该可以解释一切。您正在创建超过 100 万个对象字符串。除了字符串值之外,内存方面,你必须考虑到每个值都会被保存为一个String对象,推入内存超过100万个对象当然会产生很大的影响。
对于您的场景,要走的路是 SQLite 数据库。与你认为的相反,它并不过分。建立一个 SQLite 数据库很简单,而且对于这样的数据量非常有效。
我试图将一些表格数据读入内存以供在我的应用程序的整个 运行 中使用,但是重复实例化这些值会触发垃圾回收并导致数据加载时间很长。我读到在实例化大量对象时会发生这种情况,但我无法想出一种存储数据的方法。
数据如下所示,有 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[]
转换为 Float[]
,但这需要更长的时间。使用 Android Studio 内存分析器,我能够看到拆分导致大量 String
的实例化,这就是导致 GC 事件的原因。
我考虑过将数据存储在 SQLite 或 Firebase 中,或者设置一个快速服务器来处理大数据,但是所有这些对于将 8 MB 的数据拉入内存来说似乎太过分了。
虽然将一些数据拉入内存似乎是一项很常见的任务,但我很难找到许多其他有同样问题的人。我完全不了解我的处理方式吗?有没有其他方法可以将这些数据拉入内存,但我还没有找到?
如有任何帮助,我们将不胜感激。谢谢!
12500 行 x 101 列 = 1262500 个字符串。这应该可以解释一切。您正在创建超过 100 万个对象字符串。除了字符串值之外,内存方面,你必须考虑到每个值都会被保存为一个String对象,推入内存超过100万个对象当然会产生很大的影响。 对于您的场景,要走的路是 SQLite 数据库。与你认为的相反,它并不过分。建立一个 SQLite 数据库很简单,而且对于这样的数据量非常有效。