Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android应用程序在解析EDF文件时遇到java.lang.OutOfMemoryError_Java_Android_Jvm_Jvm Crash_European Data Format - Fatal编程技术网

Android应用程序在解析EDF文件时遇到java.lang.OutOfMemoryError

Android应用程序在解析EDF文件时遇到java.lang.OutOfMemoryError,java,android,jvm,jvm-crash,european-data-format,Java,Android,Jvm,Jvm Crash,European Data Format,我已经搜索了Similar主题,但找不到任何与EDF文件和内存不足错误相关的内容 所以,我的问题是: 我正在Android studio中开发一个Android应用程序,它可以浏览文件,选择一个“.edf”文件并对其进行解析。但对于某些文件,它会抛出以下错误(使用stacktrace): 使用特定的文件路径调用EDF构造函数时失败。 在许多地方,有人说它失败是因为JVM/Android中缺少VM或堆大小。但我想我也注意到了这一点: 内置studio.vmoptions -Xmx2048m 我猜

我已经搜索了Similar主题,但找不到任何与EDF文件和内存不足错误相关的内容

所以,我的问题是: 我正在Android studio中开发一个Android应用程序,它可以浏览文件,选择一个“.edf”文件并对其进行解析。但对于某些文件,它会抛出以下错误(使用stacktrace):

使用特定的文件路径调用EDF构造函数时失败。 在许多地方,有人说它失败是因为JVM/Android中缺少VM或堆大小。但我想我也注意到了这一点:

内置studio.vmoptions

-Xmx2048m
我猜这指定了Android Studio的JVM虚拟机大小。 我还打印Java虚拟机将尝试使用的最大内存量:

Runtime rt = Runtime.getRuntime();
long maxMemory = rt.maxMemory();
这张照片

201326592

这意味着大约有201MB可用


那么,当它成功加载4.2MB EDF文件时,加载1.9 MB EDF文件时失败(内存不足)的原因是什么?

由于EDF解析库的逻辑错误,它失败了。EDF类方法查找名为“duration”的标头(原因尚不清楚),并将其用于后续算术运算,其中使用标头值分配数组内存等。有时duration值为float,这会导致错误的算术运算,并且结果值会显著变大。在那里,它无法分配内存。 以下是代码片段:

private void readRecords(FileInputStream stream)
    throws IOException
    {
        records = new HashMap();
        int[] numberSamples = getNumberSamples();
        int[] sampling = new int[numberSignals];
        int duration = paramToInt("duration");
        int dataRecords = paramToInt("datarecords");
        byte[][] recordList = new byte[numberSignals][5];
        String[] labels = getLabels();
        byte[] buffer = null;

        // Initalizing variables
        for (int i = 0; i < numberSignals; ++i)
        {
            sampling[i] = duration * numberSamples[i];
            recordList[i] = null;
        }

        // Reading records
        for (int d = 0; d < dataRecords; ++d)
        {
            for (int i = 0; i < numberSignals; ++i)
            {
                duration = 2 * sampling[i];
                buffer = new byte[duration];
                stream.read(buffer);
                // TODO Make this insertion faster. Maybe a queue?
                recordList[i] = (recordList[i] == null)?
                    buffer :
                    EDFUtil.insert(recordList[i], buffer);
            }
        }

        // Packing records
        for (int i = 0; i < numberSignals; ++i)
        {
            String label = labels[i].trim();
            records.put(label, recordList[i]);
        }
    }
private void readRecords(FileInputStream)
抛出IOException
{
记录=新的HashMap();
int[]numberSamples=getNumberSamples();
int[]采样=新的int[numberSignals];
int duration=参数(“duration”);
int dataRecords=paramToInt(“dataRecords”);
字节[][]记录列表=新字节[numberSignals][5];
String[]labels=getLabels();
字节[]缓冲区=空;
//初始化变量
for(int i=0;i
分配512000016字节分配失败。它试图在EDFReader.java的第106行分配512MB,即
buffer=new byte[duration]。检查库中是否列出了类似的错误(OOM)。还要检查您是否正在使用最新的库版本。@nitinkumarp此处未列出此类错误。是的,我正在使用该库的最新版本。我也在努力研究它崩溃的确切方法。我一找到什么就马上发布答案。它与文件包含的通道数或数据数有关。
Runtime rt = Runtime.getRuntime();
long maxMemory = rt.maxMemory();
private void readRecords(FileInputStream stream)
    throws IOException
    {
        records = new HashMap();
        int[] numberSamples = getNumberSamples();
        int[] sampling = new int[numberSignals];
        int duration = paramToInt("duration");
        int dataRecords = paramToInt("datarecords");
        byte[][] recordList = new byte[numberSignals][5];
        String[] labels = getLabels();
        byte[] buffer = null;

        // Initalizing variables
        for (int i = 0; i < numberSignals; ++i)
        {
            sampling[i] = duration * numberSamples[i];
            recordList[i] = null;
        }

        // Reading records
        for (int d = 0; d < dataRecords; ++d)
        {
            for (int i = 0; i < numberSignals; ++i)
            {
                duration = 2 * sampling[i];
                buffer = new byte[duration];
                stream.read(buffer);
                // TODO Make this insertion faster. Maybe a queue?
                recordList[i] = (recordList[i] == null)?
                    buffer :
                    EDFUtil.insert(recordList[i], buffer);
            }
        }

        // Packing records
        for (int i = 0; i < numberSignals; ++i)
        {
            String label = labels[i].trim();
            records.put(label, recordList[i]);
        }
    }