1

我正在使用 JMatIO 将 Matlab .mat 文件读入我的 Java 程序。但是当我的代码执行时,它报告了内存不足的错误:

java.lang.OutOfMemoryError: Java heap space

我的程序只是读取一个大小约为 27M 的 mat 文件。我尝试使用几个-Xmx-XmsVM 选项来增加堆大小,但没有帮助。我的代码如下:

public class ReadMat {
    private MatFileReader reader;

    public ReadMat(File f) {
        try {
            reader = new MatFileReader(f);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        File matFile = new File("test.mat");
        ReadMat rmat = new ReadMat(matFile);
    }
}

test.mat只是一个大约 27M 的 Matlab mat 文件。OutOfMemoryError一旦我运行它就会报告。那么如何解决这个问题呢?

4

2 回答 2

1

有两个问题。一是在任何像这样的转换例程中,您通常必须在转换或加载源数组时将其保存在内存中。所以整个 27M 文件一开始就在内存中,这可能会更大,因为保存缓冲区可能更大。

其次,JMatIO 可能正在将原始类型转换为对象。例如,如果原始文件中有短片,每个短片占用 2 个字节,而您将每个短片转换为占用 16 个字节的对象,那么您的内存使用量会显着增加。

于 2013-06-13T21:19:48.820 回答
0

如果更改 JVM 堆的最小和最大大小不能解决问题,那么您需要评估 MatFileReader 如何将 test.mat 读入内存。我敢打赌,在读取文件期间 MatFileReader 的对象分配是导致 OutOfMemoryError 的原因。

于 2013-06-13T20:29:37.213 回答