1

我必须从服务器将大约 6000 条记录下载到 sqlite 数据库中。记录作为JSON对象存在。在使用 a 检索它们BufferedReader时,我收到一个错误,因为内存不足异常。我搜索了许多网站,但找不到合适的答案。请提出一些最佳解决方案。

我的代码是:

URL url = new URL("myurl");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
//getting error here
line = in.readLine();
System.out.println(line);
JSONArray outerArray = (JSONArray) JSONSerializer.toJSON(line);
System.out.println("size : " + outerArray.size());

我得到了这个致命的例外 -

                 E/AndroidRuntime(616): java.lang.OutOfMemoryError: [memory exhausted]
4

3 回答 3

1

您下载文件的大小太大而无法保存在内存中

尝试这样做

    // download the file
                InputStream input = new BufferedInputStream(url.openStream());
                OutputStream output = new FileOutputStream();

                byte data[] = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    // publishing the progress....

                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
//

有关更多说明,请参阅此

您应该使用带有 gson 或 jackson 的 json 流。对于 Jackson,您也可以使用混合方法。这将显着减少您的内存消耗,因为只有被解析的部分 json 被加载到内存中。

https://sites.google.com/site/gson/gson-user-guide

于 2013-05-10T06:49:54.337 回答
0

提供给您的应用程序的堆内存可能很低,

您需要通过清单中的条目注册应用程序以获得更大的堆,

<application android:largeHeap="true"> </application>

http://developer.android.com/guide/topics/manifest/application-element.html#largeHeap

于 2014-08-12T17:33:51.320 回答
0

您似乎正在尝试一次性下载整个 JSON 数组,这会消耗大量内存。与其做 readLine,不如尝试在固定数量的缓冲区(例如:1024)中读取输入,如果这足以生成一个或多个 JSON 数组,请解析它。然后继续阅读下一个块。这样你就不会浪费你的记忆空间

请注意,只有当您可以保证您的 JSON 数组元素不会超过 1024 字节时,此方法才有效。否则尝试相应地调整这个数字/使用可调整的数据结构

于 2013-05-10T06:54:01.523 回答