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