Java 获取字节数组时发生OutOfMemory异常

Java 获取字节数组时发生OutOfMemory异常,java,android,exception,memory,parse-platform,Java,Android,Exception,Memory,Parse Platform,我需要发送一个视频文件到parse.com。解析com正在使用字节[] 我从视频文件中获取字节数组,它工作正常。当我使用100 mb这样的大型视频文件时,它会给我: 05-25 16:27:48.934 23544-23544/com.ray.tapinto E/art﹕ Out of memory: Heap Size=192MB, Allocated=80MB, Capacity=512MB 05-25 16:27:48.934 23544-23544/com.ray.tapinto E

我需要发送一个视频文件到parse.com。解析com正在使用字节[]

我从视频文件中获取字节数组,它工作正常。当我使用100 mb这样的大型视频文件时,它会给我:

05-25 16:27:48.934  23544-23544/com.ray.tapinto E/art﹕ Out of memory: Heap Size=192MB, Allocated=80MB, Capacity=512MB
05-25 16:27:48.934  23544-23544/com.ray.tapinto E/art﹕ Throwing OutOfMemoryError "Failed to allocate a 134215692 byte allocation with 16777120 free bytes and 111MB until OOM"
05-25 16:27:48.934  23544-23544/com.ray.tapinto E/CrashReporting﹕ ParseCrashReporting caught a OutOfMemoryError exception for com.ray.tapinto. Building report.
05-25 16:27:48.944  23544-23544/com.ray.tapinto E/CrashReporting﹕ Handling exception for crash
    java.lang.OutOfMemoryError: Failed to allocate a 134215692 byte allocation with 16777120 free bytes and 111MB until OOM
            at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
            at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
            at com.ray.tapinto.ui.activity.ViewPagerActivity.getBytes(ViewPagerActivity.java:523)
            at com.ray.tapinto.ui.activity.ViewPagerActivity.onActivityResult(ViewPagerActivity.java:494)
            at android.app.Activity.dispatchActivityResult(Activity.java:6163)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3877)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3931)
            at android.app.ActivityThread.access$1300(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1408)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:155)
            at android.app.ActivityThread.main(ActivityThread.java:5721)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
用法:

...
     InputStream iStream = getContentResolver().openInputStream(videoUri);
                    byte[] inputData = getBytes(iStream);
    ....
        private byte[] getBytes(InputStream inputStream) throws IOException {
                ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
                int bufferSize = 1024;
                byte[] buffer = new byte[bufferSize];

                int len = 0;
                while ((len = inputStream.read(buffer)) != -1) {
                    byteBuffer.write(buffer, 0, len);
                }
                return byteBuffer.toByteArray();
            }
byteBuffer.write(缓冲区,0,len)崩溃

通过解析保存文件

final ParseFile imageFile = new ParseFile(filename, imageData);

        imageFile.saveInBackground(new SaveCallback() {
            @Override
            public void done(ParseException e) {
                if(e==null){
                }
            }
         }
解决方案
我发现parse.com只允许发送小于10mb的文件,所以它应该只用于存储一些小数据,如URL、缩略图等。当处理大文件时,一次性将它们加载到内存中是不好的做法。播放视频时,您可以将文件流式传输到媒体解码器。在播放之前,您不需要将其全部加载到内存中。

您需要为jvm提供更多内存,比如-Xmx512m甚至更多-Xmx1g

解析中对对象文件大小有限制。 对象的大小限制为10MB

文件

PFFile允许您在云中存储应用程序文件,这将 否则会太大或太麻烦,无法装入常规对象。 最常见的用例是存储图像,但您也可以将其用于 文档、视频、音乐和任何其他二进制数据(最多10个) 兆字节)


有关更多详细信息,我需要向parse.com服务器发送一个文件。Parse com只处理byte[]以及显示使用其API的代码位。您可能(希望)可以发送添加到主题Parse partI的
byte[]
的块,我已经看过ParseFile的源代码-无法发送块。我会设法找到一些解决办法,他们的社区很穷,所以我可以等几个月的答复