减少多处理列表的内存大小.Pool.starmap().



所以我为多处理的东西创建了一个列表(特别是它multiprocessing.Pool().starmap()),并希望减少它的内存大小。列表如下:

import sys
import numpy as np
from itertools import product
lst1 = np.arange(1000)
lst3 = np.arange(0.05, 4, 0.05)
lst1_1 = list(product(enumerate(lst3),
(item for item in product(lst1, lst1) if item[0] < item[1])
))

根据sys.getsizeof(lst1_1)计算出的内存大小317840928


看到lst1的类型是int32,我认为将 lst 的 dtype 更改为int16可以减少lst1的内存大小,因此ls1_1一半,因为int16占用了一半的内存作为int32数据,所以我做了以下操作:

lst2 = np.arange(1000, dtype = np.int16)
lst2_1 = list(product(enumerate(lst3),
(item for item in product(lst2, lst2) if item[0] < item[1])
))

令人惊讶的是,sys.getsizeof(lst2_1)计算的lst2_1的内存大小仍然317840928


我的问题如下:

1) 列表的内存大小是否独立于源数据的数据类型?

2)如果是这样,那么在不转换为生成器的情况下减少列表内存大小的最佳方法是什么?

请注意,转换为生成器无济于事的原因是,即使它被转换为生成器,当它被扔进multiprocessing.Pool().starmap()时,它无论如何都会转换回列表。

在检查这些数组的大小之前,您要将数组转换为 PythonLists。 里面的整数被转换为 Python 对象。当您这样做时,它会导致更大的尺寸。下面是代码的一个示例行为。

import sys
import numpy as np
lst1 = np.arange(1000)
lst2 = np.arange(1000, dtype = np.int16)
print(sys.getsizeof(lst1)) # 4096
print(sys.getsizeof(lst2)) # 2096
print(sys.getsizeof(list(lst1))) # 9112
print(sys.getsizeof(list(lst2))) # 9112

Numpy是一个基于 C 的库,因此您可以选择要使用的整数类型(就像 int、long、long long 一样)。您需要将数据保持在 C 型中,以便保留这些优势。这就是为什么Numpy本身具有如此多的功能,将操作和数据保持在较低的级别。

相关内容

  • 没有找到相关文章

最新更新