为 R 和 Python 存储一个大的稀疏数组

计算科学 Python 稀疏矩阵 数据管理 数据存储 r
2021-12-02 01:14:08

我一直在 R 中工作,但有时会切换到 python。与 csv 文件相比,我想要一种更跨语言的可移植方式来存储大型数组。(我正在处理的特定 csv 文件大约是 10^6 行 x 10^3 列,但只有大约 1% 的条目是非零的。)每次启动 R 或 Python 时处理一个大的 csv 文件需要很长时间太长。

我听说 HDF5 是一个很好的解决方案,但我对它的经验有限。HDF5 是否适合存储非分层数组数据?对于单个稀疏数组呢?我也不确定要使用哪个 HDF5 R 包。

3个回答

如果您对“标准化”格式感兴趣,您应该查看矩阵市场交换格式“坐标格式”(适用于稀疏矩阵)只是将元数据添加到 Aron 在他的回答中建议的格式,并指定如何格式化数据。

假设您的稀疏数组是二维的,您可以通过一次矩阵遍历将其分解为列(索引)、行(索引)和值的三个向量。然后,您可以将这些矢量存储为您想要的任何文件格式,而无需仅仅因为这个原因而切换到 HDF5。

我碰巧有这个小 Python 函数在运行:

def storeSparseProblem(sp_mat, rhs, filename):
    # Convert the sparse matrix to lil
    sp_mat = sp_mat.tocoo()

    # Make a record array out of the above
    rcv = recarray((3, len(sp_mat.row)), dtype=[("row","<i8"), ("col","<i8"), ("val","<f8")])

    # Set the values
    rcv["row"] = sp_mat.row
    rcv["col"] = sp_mat.col
    rcv["val"] = sp_mat.data

    # Open the output h5
    h5 = openFile(filename, "w")

    # Save the matrix
    h5.createTable("/", "M", rcv, title="The Matrix")

    # Add the rhs
    ary = h5.createArray("/", "rhs", rhs, title="the right hand side")

    # Close it out
    h5.close()

您可以通过打开表的魔法blosc压缩并从表切换到数组来加快速度,但这至少可以帮助您入门。加载函数真的很简单,但我似乎找不到它。如果有人有兴趣,我会把它编码并发布。