You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Dask处理48万×48万协方差矩阵SVD时遇内存错误求助

大型协方差矩阵SVD计算的内存问题(Dask+memmap方案报错)

我有一个以二进制格式存储在磁盘上的480,000×480,000大型协方差矩阵,需要计算对应的白化矩阵,因此需对该矩阵执行SVD(奇异值分解)。我的系统配置强劲(40核、360GB内存),但仍无法在内存中完成计算。尝试结合numpy.memmap与Dask来解决问题(Dask支持分块读取、处理数据并分块保存结果),但处理完整协方差矩阵时总是出现MemoryError,不清楚问题所在。

使用的简化代码

初始化Dask客户端与内存映射数组:

import numpy as np
import dask
import dask.array as da
from dask.distributed import LocalCluster, Client

client = Client(processes=False, n_workers=10, threads_per_worker=1, memory_limit="30GiB")

da_memmap = da.from_array(
    np.memmap("path_to_covariance_matrix.npy",
        mode="r",
        shape=(480000, 480000),
        dtype=np.float64
    ),
    chunks=(250, 480000)
)

执行SVD并存储结果:

u, s, v = da.linalg.svd(da_memmap)

u_path = "/mnt/big_storage/test_u.npy"
s_path = "/mnt/big_storage/test_s.npy"
v_path = "/mnt/big_storage/test_v.npy"

u_map = np.memmap(u_path, mode="w+", dtype=np.float64, shape=da_memmap.shape)
s_map = np.memmap(s_path, mode="w+", dtype=np.float64, shape=da_memmap.shape[0])
v_map = np.memmap(v_path, mode="w+", dtype=np.float64, shape=da_memmap.shape)

da.store([u, s, v], [u_map, s_map, v_map], lock=False, compute=True)

报错信息

2023-12-29 17:34:03,672 - distributed.protocol.pickle - ERROR - Failed to serialize <ToPickle: HighLevelGraph with 1 layers.
<dask.highlevelgraph.HighLevelGraph object at 0x786097501630>
 0. 132356258993664
>.
Traceback (most recent call last):
  File "/home/shash/miniconda3/envs/analysis/lib/python3.10/site-packages/distributed/protocol/pickle.py", line 63, in dumps
    result = pickle.dumps(x, **dump_kwargs)
MemoryError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/shash/miniconda3/envs/analysis/lib/python3.10/site-packages/distributed/protocol/pickle.py", line 68, in dumps
    pickler.dump(x)
MemoryError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/shash/miniconda3/envs/analysis/lib/python3.10/site-packages/distributed/protocol/pickle.py", line 81, in dumps
    result = cloudpickle.dumps(x, **dump_kwargs)
  File "/home/shash/miniconda3/envs/analysis/lib/python3.10/site-packages/cloudpickle/cloudpickle.py", line 1479, in dumps
    cp.dump(obj)
  File "/home/shash/miniconda3/envs/analysis/lib/python3.10/site-packages/cloudpickle/cloudpickle.py", line 1245, in dump
    return super().dump(obj)
MemoryError

使用可完全放入内存的较小协方差矩阵运行该代码可以正常工作,尝试调整chunk_size但无济于事。现在质疑Dask是否能够完成我想要的任务,相关的澄清也非常有用。

感谢帮助!

内容的提问来源于stack exchange,提问作者smashwhat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:45:55