在 R 中读取大型 .mat 文件

Reading large .mat file in R

我正在尝试将一个大矩阵读入 R。 该矩阵的维度为:3'987'288 x 93,大约有 3GB 大小。 (Class = 双) 它保存为 .mat 文件(不是 v7.3 .mat 文件)

我尝试用 R.matlab 包读取矩阵:

require(R.matlab) 
A <- readMat('dat_2imp.mat')

然而,它导致了这个错误:

Error in seq.int(from = rawBufferOffset + 1L, to = rawBufferOffset + nbrOfBytes,  :
  wrong sign in 'by' argument

我没有找到关于此错误消息的有价值的信息。 但是,我认为这可能是由于矩阵的大小。有人知道如何解决这个问题吗? 遗憾的是,我不允许共享原始数据并使其完全可复制。

错误应该是readMat代码中第88行的函数引发的:

# Access source code:
View(R.matlab:::readMat.default)

# In line 88 defined function: 
    readRawBuffer <- function(nbrOfBytes) {
        nTotal <- length(rawBuffer)
        if (nTotal == 0L) {
            return(raw(0L))
        }
        idxs <- seq.int(from = rawBufferOffset + 1L, to = rawBufferOffset + 
            nbrOfBytes, by = 1L)
        rawBuffer[idxs]
    }

对我来说,定义的“by”是合法的,因此错误对我来说没有意义?

显然 V7.3 不是唯一不兼容的 mat 文件版本。如 RDocuments

中所述

readMat: Reads a MAT file structure from a connection or a file Description

Reads a MAT file structure from a connection or a file. Both the MAT version 4 and MAT version 5 file formats are supported.

长话短说,版本 4 和版本 5 无法将如此大的数据集保存在一个文件中。我认为至少有 2 个解决方案是直截了当的:

  1. 以不同的文件格式交换数据,例如HDF5 或 SQLite。此类文件在 R 和 matlab 中都得到了很好的支持,并且没有兼容性问题。

  2. 使用“-v4”开关在第 4 版的 matlab 中保存 mat 文件,但第 4 版有大小上限,因此您可能需要将数据拆分到多个文件中.