我一直在 R 中工作,但有时会切换到 python。与 csv 文件相比,我想要一种更跨语言的可移植方式来存储大型数组。(我正在处理的特定 csv 文件大约是 10^6 行 x 10^3 列,但只有大约 1% 的条目是非零的。)每次启动 R 或 Python 时处理一个大的 csv 文件需要很长时间太长。
我听说 HDF5 是一个很好的解决方案,但我对它的经验有限。HDF5 是否适合存储非分层数组数据?对于单个稀疏数组呢?我也不确定要使用哪个 HDF5 R 包。
我一直在 R 中工作,但有时会切换到 python。与 csv 文件相比,我想要一种更跨语言的可移植方式来存储大型数组。(我正在处理的特定 csv 文件大约是 10^6 行 x 10^3 列,但只有大约 1% 的条目是非零的。)每次启动 R 或 Python 时处理一个大的 csv 文件需要很长时间太长。
我听说 HDF5 是一个很好的解决方案,但我对它的经验有限。HDF5 是否适合存储非分层数组数据?对于单个稀疏数组呢?我也不确定要使用哪个 HDF5 R 包。
假设您的稀疏数组是二维的,您可以通过一次矩阵遍历将其分解为列(索引)、行(索引)和值的三个向量。然后,您可以将这些矢量存储为您想要的任何文件格式,而无需仅仅因为这个原因而切换到 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压缩并从表切换到数组来加快速度,但这至少可以帮助您入门。加载函数真的很简单,但我似乎找不到它。如果有人有兴趣,我会把它编码并发布。