【发布时间】:2021-07-08 17:08:15
【问题描述】:
我需要对大于内存的张量执行一些计算,但首先我需要从适合内存的NumPy 数组(部分)构造它。
我正在计算这些NumPy 数组,然后将它们转换为Dask 数组,并将它们放在list 上。我的最终张量是这些数组的特定串联。问题是,根据部分的数量,我什至无法到达发生连接的代码行。
例如,使用形状为(30, 40, 40, 40, 40) 的部分,大约614 MB,使用16 GB 的RAM(通常10 空闲),仅尝试计算20 部分就足以耗尽内存.
我可以看到每个新张量的计算如何变慢,以及可用 RAM 如何越来越低,直到进程被终止。如果我计算10 部分,我可以看到我的可用RAM 从10 GB 下降到5.2。如果我尝试计算 20 部分,该进程将被终止。
import numpy as np
import dask.array as da
def compute_part():
array = np.random.random((30, 40, 40, 40, 40)) # 614 MB
return da.from_array(array)
def construct_tensor(nparts):
list_of_parts = []
for part in range(nparts):
part_as_da_array = compute_part()
list_of_parts.append(part_as_da_array)
# Below, the concatenation should happen
construct_tensor(20) # This is enough for the process to not finish
有没有办法更好地利用可用内存? Dask 自动创建大小为(15, 20, 20, 20, 20) 的chunks,并且我还尝试对数组进行重新分块以使每一块都更小,但我没有看到任何改进。目前,我在内存使用方面使用 Dask 数组而不是 NumPy 数组时几乎没有区别。
【问题讨论】: